4

タイトルに記載されている例外を受け取っているお客様はかなり多いのですが、どのデバイスでも再現できません。

バグレポートは、エラーが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を正しいコンパイラフラグで再準拠できないため、実際には役に立ちませんでした...

何か案は?

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が行う最後の呼び出しの1つ-データベースを含むディレクトリのfsync-は失敗しますが、そうではないようですとにかく必要です)。

于 2014-03-16T18:35:45.660 に答える