博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
分享android打开指定位置sqlite db的一个容错处理技巧
阅读量:6581 次
发布时间:2019-06-24

本文共 1562 字,大约阅读时间需要 5 分钟。

hot3.png

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,其他的类也蕴藏着丰富多彩的功能,这一切需要大家花心思,花时间去探究,去学习。
最后,送给大家一句老话,
书山有路勤为径,学海无涯苦作舟

转载于:https://my.oschina.net/luocq0769/blog/778649

你可能感兴趣的文章
手把手教你如何新建scrapy爬虫框架的第一个项目(下)
查看>>
前端基础15:JS作用域基础
查看>>
Linux系统相关命令
查看>>
BATJ面试必会之 Spring 篇(一)
查看>>
表驱动法
查看>>
什么是企业内训
查看>>
firefox无法显示java插件plugin
查看>>
H3C设备之OSPF DR选举
查看>>
List grantee right in oracle
查看>>
Activity生命周期
查看>>
通过VBS编写自动输入账号和密码、自动登录程序的脚本
查看>>
MTK APSoC SDK MT7621编译固件的快速开始
查看>>
深度解析Istio系列之安全模块篇
查看>>
Linux 系统 审计
查看>>
JS -------------------设置弹出框位置屏幕的中间
查看>>
性能测试 vbs使用(一)
查看>>
1.2 linux哲学思想
查看>>
jQuery基础
查看>>
BZOJ5312:冒险——题解
查看>>
echarts,两点连线,中间断裂
查看>>