2

最近、SQLiteOpenHelper の使用に関連する問題に遭遇しました。再現できないエラーを報告したユーザーはほとんどいません。

android.database.sqlite.SQLiteDiskIOException: disk I/O error
at android.database.sqlite.SQLiteDatabase.native_setLocale(Native Method)
at android.database.sqlite.SQLiteDatabase.setLocale(SQLiteDatabase.java:1987)
at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1855)
at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:820)
at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:197)

私の実装は次のとおりです。

public class SqliteDatabase extends SQLiteOpenHelper
{
    public SqliteDatabase(Context context, String dbName, int dbVersion)
    {
        super(context, dbName, null, dbVersion);
        this.context = context;
        this.dbName = dbName;
        this.dbVersion = dbVersion;
    }
    (...)
}

ここでは特別なことは何もありません。例外は、getReadableDatabase() の呼び出し後にスローされ、スタックに表示されます。

このクラスは多くのスレッドによってアクセスされますが、アクセスは完全に同期されていることに注意してください (ロック + 1 つのみ、同じクラス インスタンス)。アプリケーションはSDカードに移動できます(おそらくそれが問題ですか?)。

残念ながら、問題が発生するデバイス/Android のバージョンはわかりません (プラットフォーム: Google Play コンソールのその他)。

何か案は?問題があまり一般的ではないことはわかっていますが、まだ解決策が見つかりません...

4

2 に答える 2

0
  1. このタイプのエラーは、主に 2 つの操作を同時に実行した場合に発生します。
  2. 誤ってデータベースを閉じたり開いたりした場合。たとえば、データベースを閉じてからクエリを実行するとします。
于 2012-12-20T16:07:18.883 に答える
0

SQLiteDiskIOExceptionは、データベースへの同時複数アクセスに関連しています。あるスレッドがデータを取得しようとしているときに、別のスレッドが同時にデータを挿入しようとしています。

ただし、「ディスク I/O エラー」が発生する場合は、次のように DB_PATH を使用すると問題が解決するようです。

Environment.getDataDirectory() + "/data/YOUR_APP_PACKAGE/databases/";

これを読んでください: Android 2.2.1(Desire HD 1.72.405.3)でデータベース処理が機能しなくなりました

于 2012-12-20T16:08:47.853 に答える