Android获取数据库磁盘映像格式错误(代码11)错误

时间:2016-08-24 05:35:54

标签: android android-sqlite sqliteopenhelper

在我的应用程序中,我收到此数据库磁盘映像时,某些用户的格式错误(代码11)错误。我用Google搜索并了解到当数据库映像格式错误时,Android会删除它并重新创建新的数据库文件,这对某些用户来说正在发生。

这里的问题是10个用户中我只是为2-3个用户重新创建了这个错误,我无法在logcat中得到错误,为什么会发生这种情况。如果db对10个用户的格式错误,那么为什么它不为所有10个用户重新创建数据库仅为2-3个用户?有人能指出我正确的方向如何处理它?<​​/ p>

更新:我仍然无法重现该问题,但我能够获得一些日志,这里是

08-28 08:35:44.847 E/SQLiteLog(15123): (11) database corruption at 
line 65088 of [00bb9c9ce4]
08-28 08:35:44.847 E/SQLiteLog(15123): (11) statement aborts at 67      
08-28 08:35:44.857 E/DefaultDatabaseErrorHandler(15123): Corruption 
reported by sqlite on database: 
/data/data/com.retail.posmaster/databases/GrofersRetail
08-28 08:35:45.377 D/dalvikvm(15123): GC_EXPLICIT freed 2639K, 62% 
free 7479K/19228K, paused 4ms+8ms, total 82ms
08-28 08:35:45.727 E/DefaultDatabaseErrorHandler(15123): !@ Delete old 
.mark file
08-28 08:35:45.737 E/DefaultDatabaseErrorHandler(15123): !@ DB 
Corruption has happened before this
08-28 08:35:45.757 E/DefaultDatabaseErrorHandler(15123): !@ DB 
Corruption has happened before this

1 个答案:

答案 0 :(得分:1)

正如我所见,许多用户对此表示赞成,因此我假设许多其他人都面临着同样的问题。我们无法追溯到现在,这在我们的组织中不是有效的用例,因为由于产品路线图和业务逻辑的某些更改,我们不再在Android应用程序中维护数据库。 我已经进行了一些研究,以找出发生这种情况的原因,并且我有一些见解。因此,如果您的数据库很大,并且您试图将其加载到内存中,而您没有足够的内存,则数据库文件可能会损坏。 另一个原因可能是您正在维护多个数据库连接,并尝试从多个连接访问数据库而没有正确关闭先前的连接。请尝试维护单个连接并使用内容提供商。 android系统的问题是,由于某种原因数据库文件格式错误或已损坏,它将不会给您异常或任何其他方式自行处理。下次当您尝试在数据库上执行操作并尝试连接到数据库文件时,当系统检测到该文件已损坏时,Android系统会重新创建一个新的新文件,并且所有数据都将丢失。这是android系统的默认行为。 因此,如果您在应用程序中也遇到此问题,请尝试调试数据库文件损坏的原因,因为一旦数据库文件损坏,您将无法采取任何措施来停止这种行为。您可以做的另一件事是移至其他数据库,例如Realm。您可以探索一下,因为我不知道它们的行为,因为我们只是在SQLite DB上经历过这种情况。