我在某些设备上遇到上述错误(非常罕见,直到现在只有2次):
android.database.sqlite.SQLiteDiskIOException: disk I/O error (code 3850)
at android.database.sqlite.SQLiteConnection.nativeExecuteForString(Native Method)
at android.database.sqlite.SQLiteConnection.executeForString(SQLiteConnection.java:679)
at android.database.sqlite.SQLiteConnection.setJournalMode(SQLiteConnection.java:361)
at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:236)
at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:200)
at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:463)
at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:185)
at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:177)
at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:806)
at android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:791)
at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:694)
at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:669)
at ***.a(***.java:115)
我的代码中的第115行如下:
// here the exception occurs
SQLiteDatabase db = SQLiteDatabase.openDatabase(pathApp, null, SQLiteDatabase.OPEN_READONLY);
// ...
db.close();
故事
我要做的是:
就这样。这正在数千种设备上运行。我的应用程序肯定只能访问就地数据库,对此我完全确定
问题
有谁知道会导致这个问题的原因吗?
也许有趣的事实
最佳答案
最近,我遇到了类似的问题,我的应用程序在运行OxygenOS 2.1的OnePlus Two上的所有Android设备上都能正常运行。
在调查了这个问题之后,看来这种特定的组合非常敏感,并且在某种数据库锁上崩溃。就我而言,我的应用程序是在第一次运行时将新数据库复制到设备,然后检查数据库版本以查看是否需要更新。经检查,它在这些设备上崩溃了。我在代码中意识到,我要在数据库中打开一个单独的实例,而不是在检查版本时使用当前打开的数据库。更改代码以避免打开单独的数据库实例后,该应用程序停止在OnePlus上崩溃。
我的建议是不要在应用程序中打开数据库的多个实例,或者先尝试关闭数据库再重新打开数据库(也许您的复制方法没有关闭数据库或正在使用同一数据库的另一个实例)。