タイトルに記載されている例外を受け取っているお客様はかなり多いのですが、どのデバイスでも再現できません。
バグレポートは、エラーがSonyデバイスでのみ発生することを示唆しているようですが、Sonyが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);
コードについてあまり厳しくしないでください。たとえば、endTransactionが最終的に含まれるSQLステートメントの周りにtry / catchがあるはずですが、この場合は違いはありません(私は違いません)現時点でこのレガシーの混乱をクリーンアップするためのリソースを入手してください)。
AIXでSQLITE_IOERR_DIR_FSYNCに関する古いレポートがいくつか見つかりました。ディレクトリでのfsync()はサポートされていませんでしたが、AndroidでSQLiteを正しいコンパイラフラグで再準拠できないため、実際には役に立ちませんでした...
何か案は?