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

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);

请不要对代码太苛刻,我知道(例如)应该在 SQL 语句周围加上 try/catch 并在 finally 中使用 endTransaction,但在这种情况下没有任何区别(而且我目前没有资源来清理这个遗留问题)。
我找到了一些关于 AIX 上 SQLITE_IOERR_DIR_FSYNC 的旧报告,在那里目录上的 fsync() 不被支持,但是这对我没有什么帮助,因为我显然无法在 Android 上使用正确的编译器标志重新编译 SQLite...
有什么想法吗?

你是否尝试在客户报告的同一款索尼设备上重现该错误? - user_CC
啊,抱歉耽误了时间并引起了混淆,我刚看到这条消息 - 它只是在 @ 之前的 pontomedon :) - Pontomedon
你能告诉我这是哪个应用程序和哪个确切的型号发生的吗? - auselen
@Pontomedon 在 Xperia P 上尝试过,运行正常...没有遇到任何崩溃。 - user_CC
用户_CC:你的 P 上运行的是哪个 Android 版本? - Pontomedon
显示剩余7条评论
2个回答


0

这是Sony的sqlite构建中的一个错误,我向他们报告了此问题,并收到通知说他们已经修复了它。不幸的是,这个错误仍然存在于外部 - 但可以安全地忽略它,事务实际上已经成功完成(sqlite执行的最后一个调用之一 - 包含数据库的目录上的fsync失败,但似乎并不必要)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接