记录最近出现的
SQLite
数据库曝出的错误修复情况,我的小伙伴们对此都束手无策,我就偏不信邪;
经过N多次尝试,只能说完美解决了其中1/2的错误,还有一个也找到了相应解决方案,只是不完美!!
环境
[1] 插件化框架 Android-Plugin-FrameWork
[2] 通过 微信WCDB框架 对SQLite数据库
进行了加密
复现
- 通过频繁执行
Select语句
,会不定时出现- 通过频繁执行
Update\Inster语句
,会不定时出现
修复 Select 语句
引起的错误
1.首先检查数据库的完整性
db.rawQuery("PRAGMA integrity_check", null)
PRAGMA integrity_check
这是SQLite
检查数据库完整性的语句;
若integrity_check= ok
,代表数据库是完整的;
若integrity_check=wrong # of entries in index sqlite_autoindex_xxxxxxxxxx
,代表数据库中的这个索引Index
出错;
#PS:我就是出现的这个错误!!
2.修复
db.execSQL("REINDEX sqlite_autoindex_xxxxxxxxxx", null);
REINDEX sqlite_autoindex_xxxxxxxxxx
是对数据库中的报错的索引Index
进行重建;
然后再次执行Select语句
,就好啦!
修复 Update\Inster语句
引起的错误
1.首先检查数据库的完整性
db.rawQuery("PRAGMA integrity_check", null)
报错信息
*** in database main ***
Main freelist: freelist leaf count too big on page 7596
Main freelist: free-page count in header is too small
On tree page 208 cell 4: 2nd reference to page 7596
Page 7717 is never used
对于这个报错我实在的是没办法了,就将数据库进行了解密,然后再次进行了加密;神奇的一幕出现了,数据库竟然好使了,根据 https://blog.csdn.net/x844010689/article/details/38564679 的讲解,我的这种操作跟其原理一样。
目的就是将数据库数据导出到一个新数据库中,即在保证数据库中数据不丢失的情况下出将新数据库导入破损数据库中的数据。完成对数据库的修复
网友评论