代码之家  ›  专栏  ›  技术社区  ›  Pontomedon

Android Sqlite SQLiteDiskIO异常:磁盘I/O错误(代码1290)Sqlite_IOERR_DIR_FSYNC

  •  4
  • Pontomedon  · 技术社区  · 13 年前

    我有很多客户得到了标题中提到的例外,但我无法在我的任何设备上复制它。

    错误报告似乎表明错误只发生在索尼设备上,但我似乎找不到任何关于索尼在安卓系统上使用数据库的有趣报告。

    触发此异常的代码正在结束事务

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

    请不要对代码过于苛刻,我知道(例如)在endTransaction最终加入的情况下,应该在sql语句周围进行try/catch,但在这种情况下没有什么区别(我目前没有资源来清理这个遗留问题)。

    我在AIX上发现了一些关于SQLITE_IOERR_DIR_FSYNC的旧报告,其中不支持目录上的FSYNC(),但这并没有真正帮助我,因为我显然无法在Android上用正确的编译器标志重新编译SQLITE。。。

    有什么想法吗?

    2 回复  |  直到 13 年前
        2
  •  0
  •   Pontomedon    12 年前

    这是索尼sqlite构建中的一个错误,我向他们报告了它,并得到了他们修复它的通知。不幸的是,这个错误仍然存在-但我可以放心地被忽略,事实上事务已经成功完成(sqlite最后一次调用之一-在包含数据库的目录上进行fsync-失败了,但似乎没有必要)。