分享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打开数据库
技巧1——巧用errorHandler。
在代码中,打开了有问题的数据库,db还是会被赋值,继续对此db操作,如insert等,会使得应用出现崩溃等异常。errHandler与该程序不是同步的,也就是说,很有可能errorHandler里面的程序没有跑完,外面的程序已经跑到下面去了。目前来说,我还没能找到很好的办法能使得errorHandler跟主程序同步起来,但其实这个必要性并不大。可以使用isDatabaseIntegrityOk()检测db是否正常,再继续操作后续操作:
当然,可以利用isDatabaseIntegrityOk组织出更为复杂的机制,比方说,打开db后,isDatabaseIntegrityOk检测到为false,就启动一些修复机制(关于一些常用的修复机制在后续文章进行详尽的描述)。这是
技巧2——巧用isDatabaseIntegrityOk。
除上述两点外,SQLiteDatabase里还有很多很多丰富的有意思的API,不仅是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,其他的类也蕴藏着丰富多彩的功能,这一切需要大家花心思,花时间去探究,去学习。
最后,送给大家一句老话,
书山有路勤为径,学海无涯苦作舟。
相关文章推荐
- 分享android打开指定位置sqlite db的一个容错处理技巧
- 分享一个Android中的图片处理工具
- android 同时打开两个sqlite database db
- Android -- 分享功能和打开指定程序
- 解决:Android使用自带sqlite开发时,apk中创建的数据库外部的进程是没有权限去读/写的,而且无法如何读取指定目录下的db文件
- android 打开高德地图并 指定起始与结束位置 接口
- 【C#】对异步请求处理程序IHttpAsyncHandler的理解和分享一个易用性封装 【手记】走近科学之为什么明明实现了IEnumerable<T>的类型却不能调用LINQ扩展方法 【手记】手机网页弹出层后屏蔽底层的滑动响应 【手记】ASP.NET提示“未能创建类型”处理 【Web】一个非常简单的移动web消息框 【手记】解决EXCEL跑SQL遇“查询无法运行或数据库表无法打开...”
- android 分享一个处理BaseAdapter,getView()多次加载的方法
- android bitmap 指定任何一个角为圆角 处理方法
- [Android分享] GridView滚动到指定位置,可以试着去做保留上次浏览位置
- 编程回忆之Android回忆(Android sqlite的一个容错技巧)
- Android开发中一个简单实用的调试应用技巧分享
- Android SQLite数据库应用技巧分享
- 分享一个自我调节的技巧(转帖)
- 【经验分享】C#调试数据查询的一个小技巧。
- 如何打开扩展名为.DB 文件. 使用sqlite3 很方便
- 在一个exe文件中查找指定内容,找到则返回起始位置, 否则返回0
- 分享下java 读取目录及子目录下指定文件名的路径 并放到一个List数组里面返回遍历和写到文件里
- 在Java中打开一个指定的网页(兼容任何浏览器)
- vs.net2003的一个老问题“你试图打开的项目是Web项目,请指定URL路径”解决办法