sqlite数据库有一定几率出现损坏的情况

如题,头大,我用一些工程机测试时数据库坏掉的时候会自己删掉自己。。。。。。。。尤其是旧的(android4.0)出现频率还挺高的。修都没的修。

SQLite有一个很严重的缺点就是不提供Repair命令。
导致死亡提示database disk image is malformed
它的产生有很多种可能,比如,磁盘空间不足,还有就是写入数据过程中突然掉电等。
官方对产生原因的一些说明: http://www.sqlite.org/lockingv3.html#how_to_corrupt

多线程操作也容易出现这种情况。

估计我那边是因为多线程操作引起的。

微信数据库用的是sqllite数据库,数据库的名称是EnMicroMsg.db

网上说密码用手机的IMEI+UIN,然后取md5加密后的前几位数字为密码,然后就可以看数据库的内容了。

微信把数据库框架WCDB也开源了,https://github.com/Tencent/wcdb 地址在这里

参考文档:https://github.com/Tencent/wcdb/wiki

有空要看看他们的框架。他们主要为了就是降低数据库损坏率。

 

另外,我也问了朋友,他们项目用的realm,数据量大的时候查找非常快,但是坑非常多,其中一个坑就是查出来的对象不能用intent传递,只能传id。估计我这个项目先不换这个吧,毕竟查找少一些。数据条数不多。下个项目可以试试。

---------------------2018/3/8 补充------------------

经过新一轮线上错误收集,发现每天都会有几次下面这个错误

android.database.sqlite.SQLiteDiskIOException: disk I/O error (code 1034)

java.sql.SQLException: Unable to run deleteById stmt on id 9295: DELETE FROM `inspect2_result` WHERE `generatedId` = ?
com.j256.ormlite.misc.SqlExceptionUtil.create(SqlExceptionUtil.java:25)
com.j256.ormlite.stmt.mapped.MappedDelete.deleteById(MappedDelete.java:75)
com.j256.ormlite.stmt.StatementExecutor.deleteById(StatementExecutor.java:542)
com.j256.ormlite.dao.BaseDaoImpl.deleteById(BaseDaoImpl.java:487)
com.iots.epo.inspect.dao.sys.PendingRequestDao.deleteByGeneratedId(PendingRequestDao.java:124)
com.iots.epo.inspect.service.HttpService$HttpRunnable.run(HttpService.java:439)
java.lang.Thread.run(Thread.java:818)\nCaused by: java.sql.SQLException: updating database failed: DELETE FROM `inspect2_result` WHERE `generatedId` = ?
com.j256.ormlite.misc.SqlExceptionUtil.create(SqlExceptionUtil.java:27)
com.j256.ormlite.android.AndroidDatabaseConnection.update(AndroidDatabaseConnection.java:313
com.j256.ormlite.android.AndroidDatabaseConnection.delete(AndroidDatabaseConnection.java:194)
com.j256.ormlite.stmt.mapped.MappedDelete.deleteById(MappedDelete.java:64)
... 5 more\nCaused by: android.database.sqlite.SQLiteDiskIOException: disk I/O error (code 1034)
android.database.sqlite.SQLiteConnection.nativeExecute(Native Method
android.database.sqlite.SQLiteConnection.execute(SQLiteConnection.java:555
android.database.sqlite.SQLiteSession.execute(SQLiteSession.java:619)
android.database.sqlite.SQLiteStatement.execute(SQLiteStatement.java:44)
com.j256.ormlite.android.AndroidDatabaseConnection.update(AndroidDatabaseConnection.java:311)
... 7 more\n

https://sqlite.org/rescode.html#ioerr_fstat  这里查错误代码,

(1034) SQLITE_IOERR_FSYNC

The SQLITE_IOERR_FSYNC error code is an extended error code for SQLITE_IOERR indicating an I/O error in the VFS layer while trying to flush previously written content out of OS and/or disk-control buffers and into persistent storage. In other words, this code indicates a problem with the fsync() system call in unix or the FlushFileBuffers() system call in windows.

还是很困惑

转载于:https://my.oschina.net/u/268088/blog/1614952

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值