在使用数据库过程中,如果数据库文件只在内部存储器中创建,可能会被删除掉导致数据丢失(root后进入data/data下删除应用的sqlite文件),为了防止这种情况发生,可以进行数据库文件在sdcard中进行一次备份。以下是一个简单双备份数据库代码类,主要功能是实现在数据库中进行键值对存储,并且数据库及保存在内部存储器中,又保存在sdcard中.
/** *@authorxiaoli *下面是一个数据库双备份使用实例代码,双备份的好处在于,如果用户误删了内部存储器中数据库文件我们依然可以读取外部存储器的数据库 */ publicclassDoubleBackUpDB { privateStringDB_NAME=".DoubleBackUpDB.db"; privatestaticObjectsyncObj=newObject(); //内部存储器路径 publicfinalStringprivateDbPath; //外部存储器路径(Sdcard) publicfinalStringsdcardDbPath; //表名 StringTBL_NAME; //SQ创建语句 StringCREATE_TBL; /** *创建数据库 *@parampath数据库的创建路径 */ voidcreateDb( Stringpath) { sqliteDatabasedb=null; try { db=getDatabase(path); } catch(Exceptione) { } try { db.close(); } catch(Exceptionex) { } } /** * *@paramcontext *@paramsdcardDbPath构造函数需要传入存放数据库的sdcard路径 *@parammoduleName就是数据库的名字,为了表识唯一性,方便每次构造不同的双备份数据库文件. */ publicDoubleBackUpDB( Contextcontext,StringsdcardDbPath,StringmoduleName) { this(context,sdcardDbPath,moduleName,null); } /** * *@paramcontext *@paramsdcardDbPath构造函数需要传入存放数据库的sdcard路径 *@parammoduleName就是数据库的名字,为了表识唯一性,方便每次构造不同的双备份数据库文件. *@paramdbFileName可以重命名db文件名(为null则使用默认) */ publicDoubleBackUpDB( Contextcontext,StringmoduleName,StringdbFileName) { this.TBL_NAME=moduleName; if(dbFileName!=null) { this.DB_NAME=dbFileName; } this.CREATE_TBL="createtableifnotexists"+TBL_NAME+"("+"keytextprimarykeynotnull,"+"valuetext"+")"; this.privateDbPath=context.getFilesDir().getAbsolutePath()+"/"+moduleName+DB_NAME; try { PackageInfopkgInfo=context.getPackageManager().getPackageInfo(context.getPackageName(),0); sdcardDbPath=sdcardDbPath+"/"+pkgInfo.packageName+pkgInfo.versionName+moduleName+DB_NAME; } catch(Exceptione) { sdcardDbPath=sdcardDbPath+"/"+context.getPackageName()+moduleName+DB_NAME; } this.sdcardDbPath=sdcardDbPath; synchronized(syncObj) { createDb(this.privateDbPath); createDb(this.sdcardDbPath); } } /** * *@paramdbPath数据库的创建路径 *@returnsqlite数据库 */ privatesqliteDatabasegetDatabase( StringdbPath) { try { newFile(dbPath.substring(0,dbPath.lastIndexOf("/"))).mkdirs(); sqliteDatabasedb=sqliteDatabase.openOrCreateDatabase(dbPath,null); try { db.execsql(CREATE_TBL); } catch(Exceptionex) { } returndb; } catch(Exceptione) { newFile(dbPath.substring(0,null); try { db.execsql(CREATE_TBL); } catch(Exceptionex) { } returndb; } } publicvoidsetValue( Stringkey,Integervalue) { setValue(key,value!=null?value.longValue():null); } publicvoidsetValue( Stringkey,Longvalue) { setValue(key,value!=null?value.toString():null); } publicvoidsetValue( Stringkey,Stringvalue) { synchronized(syncObj) { setStringToDB(privateDbPath,key,value); setStringToDB(sdcardDbPath,value); } } publicIntegergetInt( Stringkey) { returngetInt(key,null); } publicIntegergetInt( Stringkey,IntegerdefaultValue) { Longresult=getLong(key); if(result==null) { returndefaultValue; } returnresult.intValue(); } publicLonggetLong( Stringkey) { returngetLong(key,null); } publicLonggetLong( Stringkey,LongdefaultValue) { try { returnLong.parseLong(getString(key)); } catch(Exceptione) { returndefaultValue; } } publicStringgetString( Stringkey,StringdefaultValue) { Stringresult=getString(key); if(result==null) { returndefaultValue; } returnresult; } publicStringgetString( Stringkey) { synchronized(syncObj) { Stringvalue=getStringFromDB(privateDbPath,key); if(value==null) { value=getStringFromDB(sdcardDbPath,key); } returnvalue; } } /** *通过key值查询数据库相应的内容 *@paramdbPath数据库路径 *@paramkey键值 *@return查询结果 */ privateStringgetStringFromDB( StringdbPath,Stringkey) { Stringvalue=null; sqliteDatabasedb=null; Cursorc=null; try { db=getDatabase(dbPath); c=db.query(TBL_NAME,null,"key='"+key+"'",null); if(c.moveToFirst()) { value=c.getString(1); } } catch(Exceptione) { } finally { try { c.close(); } catch(Exceptione) { } try { db.close(); } catch(Exceptione) { } } returnvalue; } /** *储存内容到数据库 *@paramdbPath数据库路径 *@paramkey键值 *@paramvalue实际存入值 */ privatevoidsetStringToDB( StringdbPath,Stringkey,Stringvalue) { sqliteDatabasedb=null; Cursorc=null; try { db=getDatabase(dbPath); if(value!=null) { ContentValuescontent=newContentValues(); content.put("key",key); content.put("value",value); c=db.query(TBL_NAME,null); if(c.moveToFirst()) { db.update(TBL_NAME,content,null); } else { db.insert(TBL_NAME,content); } } else { db.delete(TBL_NAME,null); } } catch(Exceptione) { } finally { try { c.close(); } catch(Exceptione) { } try { db.close(); } catch(Exceptione) { } } } }原文链接:https://www.f2er.com/sqlite/199959.html