在我的应用程序中,我得到了一些用户的数据库磁盘映像格式错误(代码11)。我在googled上搜索了它,并了解到当db映像格式错误时,Android会删除它并重新创建一些用户正在发生的新db文件。
这里的问题是,在10个用户中,我得到了这个错误,因为db只为2-3个用户重新创建,而且我无法复制这个错误。我不知道为什么会这样。如果数据库对于10个用户是错误的,那么为什么android不为所有10个用户重新创建db。为什么只适用于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
发布于 2018-07-23 05:00:14
正如我所看到的,很多用户都投了这个票,所以我假设很多其他人都面临着同样的问题。我们无法追溯这一点,现在它在我们的组织中不是一个有效的用例,因为由于产品路线图和业务逻辑上的一些变化,我们已经不再在Android应用程序中维护DB。我做了一些研究来找出它发生的原因,我也有一些见解。因此,如果您的DB大小非常大,并且试图将其加载到内存中,并且没有足够的内存,则DB文件可能会损坏。另一个原因可能是,您正在维护多个DB连接,并试图从多个连接访问DB,而不正确关闭前面的连接。请尝试维护单个连接并使用内容提供程序。android系统的问题是,如果DB文件由于任何原因而出现错误或损坏,它不会给您一个异常或任何其他手动处理它的方法。下一次,当您试图对DB执行操作并试图连接到DB文件时,当系统检测到该文件已损坏时,Android系统将重新创建一个新的文件,您的所有数据都会丢失。这是android系统的默认行为。因此,如果您在应用程序中也面临此问题,请尝试调试数据库文件损坏的原因,因为一旦您的DB文件被破坏,您就不能做任何事情来阻止这种行为。您可以做的另一件事是迁移到其他DB,如领域。您可以探索这一点,因为我不知道他们的行为,因为我们只在SQLite DB上经历过这种情况。
发布于 2022-10-27 10:37:17
我也有同样的问题。
Android9引入了一种特殊的SQLiteDatabase模式,称为兼容性WAL (写前日志),它允许数据库使用journal_mode=WAL,同时保持每个数据库最多只能保持一个连接的行为。
你可以试试这个。
public class YourSQLiteOpenHelper extends SQLiteOpenHelper {
...
@Override
public void onConfigure(SQLiteDatabase db) {
super.onConfigure(db);
// Disable WAL
db.disableWriteAheadLogging();
// Enable WAL
// db.enableWriteAheadLogging();
}
...
https://stackoverflow.com/questions/39115159
复制相似问题