4

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

错误报告似乎表明该错误仅发生在索尼设备上,但我似乎找不到任何关于索尼在 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 ...

有任何想法吗?

4

2 回答 2

0

试试这个补丁,它看起来与

https://android.googlesource.com/platform/external/sqlite.git/+/6ab557bdc070f11db30ede0696888efd19800475%5E!/#F0

于 2013-04-19T16:18:38.037 回答
0

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

于 2014-03-16T18:35:45.660 回答