標籤:android sqlite雙備份
在使用資料庫過程中,如果資料庫檔案只在內部儲存空間中建立,可能會被刪除掉導致資料丟失(root後進入data/data下刪除應用的sqlite檔案),為了防止這種情況發生,可以進行資料庫檔案在sdcard中進行一次備份。以下是一個簡單雙備份資料庫代碼類,主要功能是實現在資料庫中進行索引值對儲存,並且資料庫及儲存在內部儲存空間中,又儲存在sdcard中.
/** * @author xiaoli * 下面是一個資料庫雙備份使用執行個體代碼,雙備份的好處在於,如果使用者誤刪了內部儲存空間中資料庫檔案我們依然可以讀取外部儲存空間的資料庫 */public class DoubleBackUpDB{private String DB_NAME = ".DoubleBackUpDB.db";private static Object syncObj = new Object();//內部儲存空間路徑public final String privateDbPath;//外部儲存空間路徑(Sdcard)public final String sdcardDbPath;//表名String TBL_NAME;//SQ建立語句String CREATE_TBL;/** * 建立資料庫 * @param path 資料庫的建立路徑 */void createDb(String path ){SQLiteDatabase db = null;try{db = getDatabase( path );}catch( Exception e ){}try{db.close();}catch( Exception ex ){}}/** * * @param context * @param sdcardDbPath 建構函式需要傳入存放資料庫的sdcard路徑 * @param moduleName 就是資料庫的名字,為了表識唯一性,方便每次構造不同的雙備份資料庫檔案. */public DoubleBackUpDB(Context context ,String sdcardDbPath ,String moduleName ){this( context , sdcardDbPath , moduleName , null );}/** * * @param context * @param sdcardDbPath 建構函式需要傳入存放資料庫的sdcard路徑 * @param moduleName 就是資料庫的名字,為了表識唯一性,方便每次構造不同的雙備份資料庫檔案. * @param dbFileName 可以重新命名db檔案名稱(為null則使用預設) */public DoubleBackUpDB(Context context ,String sdcardDbPath ,String moduleName ,String dbFileName ){this.TBL_NAME = moduleName;if( dbFileName != null ){this.DB_NAME = dbFileName;}this.CREATE_TBL = "create table if not exists " + TBL_NAME + "(" + "key text primary key not null," + "value text" + ")";this.privateDbPath = context.getFilesDir().getAbsolutePath() + "/" + moduleName + DB_NAME;try{PackageInfo pkgInfo = context.getPackageManager().getPackageInfo( context.getPackageName() , 0 );sdcardDbPath = sdcardDbPath + "/" + pkgInfo.packageName + pkgInfo.versionName + moduleName + DB_NAME;}catch( Exception e ){sdcardDbPath = sdcardDbPath + "/" + context.getPackageName() + moduleName + DB_NAME;}this.sdcardDbPath = sdcardDbPath;synchronized( syncObj ){createDb( this.privateDbPath );createDb( this.sdcardDbPath );}}/** * * @param dbPath 資料庫的建立路徑 * @return Sqlite資料庫 */private SQLiteDatabase getDatabase(String dbPath ){try{new File( dbPath.substring( 0 , dbPath.lastIndexOf( "/" ) ) ).mkdirs();SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase( dbPath , null );try{db.execSQL( CREATE_TBL );}catch( Exception ex ){}return db;}catch( Exception e ){new File( dbPath.substring( 0 , dbPath.lastIndexOf( "/" ) ) ).mkdirs();SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase( dbPath , null );try{db.execSQL( CREATE_TBL );}catch( Exception ex ){}return db;}}public void setValue(String key ,Integer value ){setValue( key , value != null ? value.longValue() : null );}public void setValue(String key ,Long value ){setValue( key , value != null ? value.toString() : null );}public void setValue(String key ,String value ){synchronized( syncObj ){setStringToDB( privateDbPath , key , value );setStringToDB( sdcardDbPath , key , value );}}public Integer getInt(String key ){return getInt( key , null );}public Integer getInt(String key ,Integer defaultValue ){Long result = getLong( key );if( result == null ){return defaultValue;}return result.intValue();}public Long getLong(String key ){return getLong( key , null );}public Long getLong(String key ,Long defaultValue ){try{return Long.parseLong( getString( key ) );}catch( Exception e ){return defaultValue;}}public String getString(String key ,String defaultValue ){String result = getString( key );if( result == null ){return defaultValue;}return result;}public String getString(String key ){synchronized( syncObj ){String value = getStringFromDB( privateDbPath , key );if( value == null ){value = getStringFromDB( sdcardDbPath , key );}return value;}}/** * 通過key值查詢資料庫相應的內容 * @param dbPath 資料庫路徑 * @param key 索引值 * @return 查詢結果 */private String getStringFromDB(String dbPath ,String key ){String value = null;SQLiteDatabase db = null;Cursor c = null;try{db = getDatabase( dbPath );c = db.query( TBL_NAME , null , "key=‘" + key + "‘" , null , null , null , null );if( c.moveToFirst() ){value = c.getString( 1 );}}catch( Exception e ){}finally{try{c.close();}catch( Exception e ){}try{db.close();}catch( Exception e ){}}return value;}/** * 儲存內容到資料庫 * @param dbPath 資料庫路徑 * @param key 索引值 * @param value 實際存入值 */private void setStringToDB(String dbPath ,String key ,String value ){SQLiteDatabase db = null;Cursor c = null;try{db = getDatabase( dbPath );if( value != null ){ContentValues content = new ContentValues();content.put( "key" , key );content.put( "value" , value );c = db.query( TBL_NAME , null , "key=‘" + key + "‘" , null , null , null , null );if( c.moveToFirst() ){db.update( TBL_NAME , content , "key=‘" + key + "‘" , null );}else{db.insert( TBL_NAME , null , content );}}else{db.delete( TBL_NAME , "key=‘" + key + "‘" , null );}}catch( Exception e ){}finally{try{c.close();}catch( Exception e ){}try{db.close();}catch( Exception e ){}}}}
已上傳附件,可以直接拿來修改使用.
一個簡單的Sqlite雙備份代碼