گرفتن backup از دیتابیس sqlite در اندروید

سلام در این سری از اموزش های دیتابیس در اندروید میخواهیم به گرفتن نسخه پشتیبان از دیتابیس بپردازیم.یکی از مهم ترین کارهایی که برای هر دیتابیسی لازم است گرفتن نسخه بکاپ از دیتابیس است که در این اموزش به طور کامل به ان پرداخته خواهد شد.
خب برای اینکار ما سه کار اصلی باید انجام دهیم که شامل export و  import و restore است.برای اینکار یک کلاس ایجاد میکنیم که همه این عملیات را انجام دهد.در اینجا نام این کلاس را DbExportImport قرار داده ایم:

public class DbExportImport {
public static final String TAG = DbExportImport.class.getName();
/** Directory that files are to be read from and written to **/
protected static final File DATABASE_DIRECTORY =
new File(Environment.getExternalStorageDirectory(),"MyDirectory");
/** File path of Db to be imported **/
protected static final File IMPORT_FILE =
new File(DATABASE_DIRECTORY,"MyDb.db");
public static final String PACKAGE_NAME = "com.example.app";
public static final String DATABASE_NAME = "example.db";
public static final String DATABASE_TABLE = "entryTable";
/** Contains: /data/data/com.example.app/databases/example.db **/
private static final File DATA_DIRECTORY_DATABASE =
new File(Environment.getDataDirectory() +
"/data/" + PACKAGE_NAME +
"/databases/" + DATABASE_NAME );
/** Saves the application database to the
* export directory under MyDb.db **/
protected static  boolean exportDb(){
if( ! SdIsPresent() ) return false;
File dbFile = DATA_DIRECTORY_DATABASE;
String filename = "MyDb.db";
File exportDir = DATABASE_DIRECTORY;
File file = new File(exportDir, filename);
if (!exportDir.exists()) {
exportDir.mkdirs();
}
try {
file.createNewFile();
copyFile(dbFile, file);
return true;
} catch (IOException e) {
e.printStackTrace();
return false;
}
}
/** Replaces current database with the IMPORT_FILE if
* import database is valid and of the correct type **/
protected static boolean restoreDb(){
if( ! SdIsPresent() ) return false;
File exportFile = DATA_DIRECTORY_DATABASE;
File importFile = IMPORT_FILE;
if( ! checkDbIsValid(importFile) ) return false;
if (!importFile.exists()) {
Log.d(TAG, "File does not exist");
return false;
}
try {
exportFile.createNewFile();
copyFile(importFile, exportFile);
return true;
} catch (IOException e) {
e.printStackTrace();
return false;
}
}
/** Imports the file at IMPORT_FILE **/
protected static boolean importIntoDb(Context ctx){
if( ! SdIsPresent() ) return false;
File importFile = IMPORT_FILE;
if( ! checkDbIsValid(importFile) ) return false;
try{
SQLiteDatabase sqlDb = SQLiteDatabase.openDatabase
(importFile.getPath(), null, SQLiteDatabase.OPEN_READONLY);
Cursor cursor = sqlDb.query(true, DATABASE_TABLE,
     null, null, null, null, null, null, null
    );
DbAdapter dbAdapter = new DbAdapter(ctx);
dbAdapter.open();
final int titleColumn = cursor.getColumnIndexOrThrow("title");
final int timestampColumn = cursor.getColumnIndexOrThrow("timestamp");
// Adds all items in cursor to current database
cursor.moveToPosition(-1);
while(cursor.moveToNext()){
dbAdapter.createQuote(
cursor.getString(titleColumn),
cursor.getString(timestampColumn)
);
}
sqlDb.close();
cursor.close();
dbAdapter.close();
} catch( Exception e ){
e.printStackTrace();
return false;
}
return true;
}
/** Given an SQLite database file, this checks if the file
* is a valid SQLite database and that it contains all the
* columns represented by DbAdapter.ALL_COLUMN_KEYS **/
protected static boolean checkDbIsValid( File db ){
try{
SQLiteDatabase sqlDb = SQLiteDatabase.openDatabase
(db.getPath(), null, SQLiteDatabase.OPEN_READONLY);
Cursor cursor = sqlDb.query(true, DATABASE_TABLE,
             null, null, null, null, null, null, null
            );
// ALL_COLUMN_KEYS should be an array of keys of essential columns.
// Throws exception if any column is missing
for( String s : DbAdapter.ALL_COLUMN_KEYS ){
cursor.getColumnIndexOrThrow(s);
}
sqlDb.close();
cursor.close();
} catch( IllegalArgumentException e ) {
Log.d(TAG, "Database valid but not the right type");
e.printStackTrace();
return false;
} catch( SQLiteException e ) {
Log.d(TAG, "Database file is invalid.");
e.printStackTrace();
return false;
} catch( Exception e){
Log.d(TAG, "checkDbIsValid encountered an exception");
e.printStackTrace();
return false;
}
return true;
}
private static void copyFile(File src, File dst) throws IOException {
FileChannel inChannel = new FileInputStream(src).getChannel();
FileChannel outChannel = new FileOutputStream(dst).getChannel();
try {
inChannel.transferTo(0, inChannel.size(), outChannel);
} finally {
if (inChannel != null)
inChannel.close();
if (outChannel != null)
outChannel.close();
}
}
/** Returns whether an SD card is present and writable **/
public static boolean SdIsPresent() {
return Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED);
}
}

خب ابتدا ما نام و مسیر دیتابیس پشتیبان خود را با در IMPORT_FILE مشخص کردیم.همینطور سه متغییر برای داشتن مسیر دیتابیس اصلی که در DATA_DIRECTORY_DATABASE طریقه استفاده از ان ها را میبینید.حالا به بررسی توابع میپردازیم:
exportDb:یک تابع با این نام ایجاد کردیم که وظیفه ایجاد دیتابیس پشتیبان را دارد و با کمی دقت متوجه عملیات های ان می شوید تنها نکته مهم ان تابع copyFile است که در ان استفاده شده است و وظیفه کپی دیتابیس را دارد در واقع از دیتابیس اصلی یک کپی به عنوان پشتیبان میگیرد.
restoreDb:این تابع وظیفه بازگردانی دیتابیس را از دیتابیس پشتیبان دارد همانطور که میبینید بعد از بررسی وجود فایل و و بررسی وجود نسخه پشتیبان با تابع checkDbIsValid که در اخر به ان می رسیم دیتابیس را با دیتابیس پشتیبان جایگزین میکند با استفاده از copyFile که در تابع قبلی هم برای کپی از ان استفاده کردیم.
importIntoDb:خب این تابع همانطور که از نامش پیداست برای وارد کردن فایل ها از نسخه پشتیبان است که با دستورات ان در مباحث sqlite اشنا شدیم.
checkDbIsValid:این تابع وظیفه بررسی دیتابیس را دارد که ایا دیتابیس معتبر است یا خیر.
copyFile:همانطور که قبل تر از ان استفاده کردیم این تابع عملیات کپی را انجام می دهد که بررسی دقیق ان از حوصله این بخش خارج است.
SdIsPresent:برای بررسی sd card از این تابع استفاده میکنیم.
حال که با بخش های مختلف این کلاس اشنا شدیم میتوانیم به راحتی از ان برای گرفتن بکاپ استفاده کنیم.
به پایان این اموزش رسیدیم امیدوارم  مفید بوده باشه
موفق باشید…
 

مطالعه بیشتر