我有很多客户得到标题中提到的异常,但我无法在我的任何设备上重现它。
错误报告似乎表明该错误仅发生在索尼设备上,但我似乎找不到任何关于索尼在 Android 上使用他们的数据库做任何有趣事情的报告。
触发此异常的代码正在结束事务
db.beginTransaction();
for(some iterator)
db.execSQL("UPDATE table SET column = " + value + " WHERE other_column = " + something);
db.setTransactionSuccessful();
db.endTransaction();
这里的堆栈跟踪是:
android.database.sqlite.SQLiteDiskIOException: disk I/O error (code 1290)
at android.database.sqlite.SQLiteConnection.nativeExecute(Native Method)
at android.database.sqlite.SQLiteConnection.execute(SQLiteConnection.java:559)
at android.database.sqlite.SQLiteSession.endTransactionUnchecked(SQLiteSession.java:437)
at android.database.sqlite.SQLiteSession.endTransaction(SQLiteSession.java:401)
at android.database.sqlite.SQLiteDatabase.endTransaction(SQLiteDatabase.java:530)
数据库驻留在外部存储上(但根据客户报告,它发生在安装外部存储时):
SQLiteDatabase db = SQLiteDatabase.openDatabase("/path/to/sqlite", null, SQLiteDatabase.NO_LOCALIZED_COLLATORS);
请不要对代码太苛刻,我知道(例如)应该有一个 try/catch 围绕在 endTransaction 的 sql 语句中,但在这种情况下它没有任何区别(而且我没有获得资源来清理这个遗留的混乱)。
我在 AIX 上发现了一些关于 SQLITE_IOERR_DIR_FSYNC 的旧报告,其中不支持目录上的 fsync() ,但这并没有真正帮助我,因为我显然无法在 Android 上使用正确的编译器标志重新编译 SQLite ...
有任何想法吗?