我有很多客户遇到标题中提到的异常,但是在我的任何设备上都无法重现它。
错误报告似乎表明这个错误只会在索尼设备上发生,但我似乎找不到任何关于索尼在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);
请不要对代码太苛刻,我知道(例如)应该在 SQL 语句周围加上 try/catch 并在 finally 中使用 endTransaction,但在这种情况下没有任何区别(而且我目前没有资源来清理这个遗留问题)。
我找到了一些关于 AIX 上 SQLITE_IOERR_DIR_FSYNC 的旧报告,在那里目录上的 fsync() 不被支持,但是这对我没有什么帮助,因为我显然无法在 Android 上使用正确的编译器标志重新编译 SQLite...
有什么想法吗?