Android — 解决SQLite: disk image i

2019-10-22  本文已影响0人  AntCoding

记录最近出现的SQLite数据库曝出的错误修复情况,我的小伙伴们对此都束手无策,我就偏不信邪;
经过N多次尝试,只能说完美解决了其中1/2的错误,还有一个也找到了相应解决方案,只是不完美!!

环境

[1] 插件化框架 Android-Plugin-FrameWork
[2] 通过 微信WCDB框架SQLite数据库进行了加密

复现

  1. 通过频繁执行 Select语句,会不定时出现
  2. 通过频繁执行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 的讲解,我的这种操作跟其原理一样。
目的就是将数据库数据导出到一个新数据库中,即在保证数据库中数据不丢失的情况下出将新数据库导入破损数据库中的数据。完成对数据库的修复

This ALL! Thanks EveryBody!

上一篇 下一篇

猜你喜欢

热点阅读