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

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,其他的类也蕴藏着丰富多彩的功能,这一切需要大家花心思,花时间去探究,去学习。

最后,送给大家一句老话, 书山有路勤为径,学海无涯苦作舟
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值