您的位置:首页 > 移动开发 > Android开发

分享android打开指定位置sqlite db的一个容错处理技巧

2016-10-31 00:00 309 查看
android.content.Context与android.database.sqlite.SQLiteDatabase均存在打开数据库的接口,android.content.Context里面接口最后也是需要调用到SQLiteDatabase里面相应的接口,从表征上看,使用Context里面的接口操作的是私有目录的数据库,即/data/data/<pkg name>下的db文件,主要提供给应用上下文使用。android.database.sqlite.SQLiteDatabase里则提供了操作任意位置数据库的接口。(这里可能不严谨,请各位指正)

这里以android.database.sqlite.SQLiteDatabase的openOrCreateDatabase为例,选取以下API打开数据库

static SQLiteDatabase openOrCreateDatabase(String path, SQLiteDatabase.CursorFactory factory, DatabaseErrorHandler errorHandler)
常用的代码有:

db = SQLiteDatabase.openOrCreateDatabase(dbFile, null, null);
这里面需要注意的是,如果打开dbFile出错,如报了error code = 11(即The database disk image is malformed),由于没有显式注册errorHandler,sqlite会执行默认的错误处理——删除此数据库文件。如果希望出错时把文件留下来分析处理,或者执行一些指定动作,需要把erroHandler写上,比如:

db = SQLiteDatabase.openOrCreateDatabase(dbFile, null,   new DatabaseErrorHandler(){  public void onCorruption(SQLiteDatabase dbObj) {  System.out.println("###### enter error handler ##########");  }  } );
这样的话,出现问题的数据库即可保留下来,这是
技巧1——巧用errorHandler

在代码中,打开了有问题的数据库,db还是会被赋值,继续对此db操作,如insert等,会使得应用出现崩溃等异常。errHandler与该程序不是同步的,也就是说,很有可能errorHandler里面的程序没有跑完,外面的程序已经跑到下面去了。目前来说,我还没能找到很好的办法能使得errorHandler跟主程序同步起来,但其实这个必要性并不大。可以使用isDatabaseIntegrityOk()检测db是否正常,再继续操作后续操作:

if(db.isDatabaseIntegrityOk()) { <CMD> }


当然,可以利用isDatabaseIntegrityOk组织出更为复杂的机制,比方说,打开db后,isDatabaseIntegrityOk检测到为false,就启动一些修复机制(关于一些常用的修复机制在后续文章进行详尽的描述)。这是
技巧2——巧用isDatabaseIntegrityOk

除上述两点外,SQLiteDatabase里还有很多很多丰富的有意思的API,不仅是SQLiteDatabase,其他的类也蕴藏着丰富多彩的功能,这一切需要大家花心思,花时间去探究,去学习。

最后,送给大家一句老话,
书山有路勤为径,学海无涯苦作舟
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐