Android 获取数据库磁盘映像格式错误(代码 11)错误
Android getting database disk image is malformed (code 11) error
在我的应用程序中,某些用户收到此数据库磁盘映像格式错误(代码 11)错误。我在谷歌上搜索了一下,发现当 db 图像格式错误时 Android 将其删除并重新创建新的 db 文件,某些用户正在发生这种情况。
这里的问题是 10 个用户中我收到此错误,因为 db 仅为 2-3 个用户重新创建,我无法重现此问题。我不知道为什么会这样。如果 10 个用户的数据库格式不正确,那么为什么 android 没有为所有 10 个用户重新创建数据库。为什么只针对那 2-3 个用户?有人可以指出正确的方向如何处理吗?
更新:我仍然无法重现该问题,但我能够获取一些日志。他们在这里:
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
正如我所看到的,很多用户对此投了赞成票,所以我假设很多其他人都面临着同样的问题。我们无法追溯这一点,现在它在我们的组织中不是一个有效的用例,因为由于产品路线图和业务逻辑的一些变化,我们已经不再在我们的 Android 应用程序中维护数据库。
我做了一些研究以找出发生这种情况的原因,并且我有一些见解。因此,如果您的数据库非常大,并且您正试图将其加载到内存中,而您没有足够的内存,则数据库文件可能会损坏。
另一个原因可能是您正在维护多个数据库连接并尝试从多个连接访问数据库而没有正确关闭以前的连接。请尝试保持单一连接并使用内容提供程序。
android 系统的问题是,如果数据库文件由于任何原因格式错误或损坏,它不会给您异常或您自己手动处理的任何其他方式。下次当您尝试对数据库进行操作并尝试连接到数据库文件时,当系统检测到该文件已损坏时,Android 系统会重新创建一个新文件并且您的所有数据都是丢失。这是 android 系统的默认行为。
因此,如果您在应用程序中也遇到此问题,请尝试调试您的数据库文件损坏的原因,因为一旦您的数据库文件损坏,您将无法采取任何措施来阻止此行为。您可以做的另一件事是移动到其他数据库,例如 Realm。你可以探索一下,因为我不知道他们的行为,因为我们只在 SQLite DB 上经历过。
在我的应用程序中,某些用户收到此数据库磁盘映像格式错误(代码 11)错误。我在谷歌上搜索了一下,发现当 db 图像格式错误时 Android 将其删除并重新创建新的 db 文件,某些用户正在发生这种情况。
这里的问题是 10 个用户中我收到此错误,因为 db 仅为 2-3 个用户重新创建,我无法重现此问题。我不知道为什么会这样。如果 10 个用户的数据库格式不正确,那么为什么 android 没有为所有 10 个用户重新创建数据库。为什么只针对那 2-3 个用户?有人可以指出正确的方向如何处理吗?
更新:我仍然无法重现该问题,但我能够获取一些日志。他们在这里:
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
正如我所看到的,很多用户对此投了赞成票,所以我假设很多其他人都面临着同样的问题。我们无法追溯这一点,现在它在我们的组织中不是一个有效的用例,因为由于产品路线图和业务逻辑的一些变化,我们已经不再在我们的 Android 应用程序中维护数据库。 我做了一些研究以找出发生这种情况的原因,并且我有一些见解。因此,如果您的数据库非常大,并且您正试图将其加载到内存中,而您没有足够的内存,则数据库文件可能会损坏。 另一个原因可能是您正在维护多个数据库连接并尝试从多个连接访问数据库而没有正确关闭以前的连接。请尝试保持单一连接并使用内容提供程序。 android 系统的问题是,如果数据库文件由于任何原因格式错误或损坏,它不会给您异常或您自己手动处理的任何其他方式。下次当您尝试对数据库进行操作并尝试连接到数据库文件时,当系统检测到该文件已损坏时,Android 系统会重新创建一个新文件并且您的所有数据都是丢失。这是 android 系统的默认行为。 因此,如果您在应用程序中也遇到此问题,请尝试调试您的数据库文件损坏的原因,因为一旦您的数据库文件损坏,您将无法采取任何措施来阻止此行为。您可以做的另一件事是移动到其他数据库,例如 Realm。你可以探索一下,因为我不知道他们的行为,因为我们只在 SQLite DB 上经历过。