Android Sqlite SQLiteDiskIOException:磁盘I / O错误(代码1290)SQLITE_IOERR_DIR_FSYNC

时间:2013-03-18 07:41:05

标签: android sqlite sony fsync

我有很多客户收到标题中提到的异常,但我无法在我的任何设备上重现它。

错误报告似乎表明错误只发生在索尼设备上,但我似乎无法找到索尼在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 ...

任何想法?

2 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

这是索尼的sqlite版本中的一个错误,我向他们报告并得到他们修复它的通知。不幸的是,这个bug仍然在野外 - 但我可以安全地被忽略,事务实际上已成功完成(sqlite最后一次调用 - 包含数据库的目录上的fsync失败了,但似乎没有无论如何都是必要的。)

相关问题