我有很多客户收到标题中提到的异常,但我无法在我的任何设备上重现它。
错误报告似乎表明错误只发生在索尼设备上,但我似乎无法找到索尼在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围绕sql语句,endTransaction最终,但在这种情况下没有区别(和我目前没有足够的资源来清理这一遗留问题。)
我在AIX上找到了一些关于SQLITE_IOERR_DIR_FSYNC的旧报告,其中不支持目录上的fsync(),但这对我没有帮助,因为我显然无法在Android上使用正确的编译器标志重写SQLite ...
任何想法?
答案 0 :(得分:0)
试试这个补丁,看起来与
有关答案 1 :(得分:0)
这是索尼的sqlite版本中的一个错误,我向他们报告并得到他们修复它的通知。不幸的是,这个bug仍然在野外 - 但我可以安全地被忽略,事务实际上已成功完成(sqlite最后一次调用 - 包含数据库的目录上的fsync失败了,但似乎没有无论如何都是必要的。)