エラー:SQLiteDatabaseLockedException: database is locked (code 5)

投稿者: Anonymous

データベースのバージョンを変更し、データベースのアップグレードをしようとしたところ以下のようなエラーメッソージが返ってきました。
「android.database.sqlite.SQLiteDatabaseLockedException: database is locked (code 5): , while compiling: PRAGMA journal_mode」
色々調べて、データベースをcloseしてみてもうまくいきません。(closeの仕方が間違っているのかもしれませんが…)
下記にコードを記載します。
現在setDataToDBメソッドの中でエラーが出ています。
すみませんが、宜しくお願いします。

public class MyDBHelper extends SQLiteOpenHelper {

        public MyDBHelper(Context context) {
            super(context, DB_NAME, null, DB_VERSION);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            db.beginTransaction();
            try {
                db.execSQL("CREATE TABLE IF NOT EXISTS " + TB_MAN + "(ID INTEGER PRIMARY KEY AUTOINCREMENT, VOICE TEXT)");
                db.execSQL("CREATE TABLE IF NOT EXISTS " + TB_WOMAN + "(ID INTEGER PRIMARY KEY AUTOINCREMENT, VOICE TEXT)");
                db.execSQL("CREATE TABLE IF NOT EXISTS " + TB_WOMAN_MAX + "(ID INTEGER PRIMARY KEY AUTOINCREMENT, VOICE TEXT)");
                db.execSQL("CREATE TABLE IF NOT EXISTS " + TB_WOMAN_MAX + "(ID INTEGER PRIMARY KEY AUTOINCREMENT, VOICE TEXT)");
            }finally {
                db.endTransaction();
            }
            setDataToDB("aaa", "bbb", Uri.parse("content://taro.thanks.MyContentProvider/" + TB_MAN));
            setDataToDB("AAA", "BBB", Uri.parse("content://taro.thanks.MyContentProvider/" + TB_MAN_MAX));
            setDataToDB("ccc", "ddd", Uri.parse("content://taro.thanks.MyContentProvider/" + TB_WOMAN));
            setDataToDB("CCC", "DDD", Uri.parse("content://taro.thanks.MyContentProvider/" + TB_WOMAN_MAX));
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            db.beginTransaction();
            try {
                db.execSQL("DROP TABLE IF EXISTS " + TB_MAN);
                db.execSQL("DROP TABLE IF EXISTS " + TB_WOMAN);
                db.execSQL("DROP TABLE IF EXISTS " + TB_MAN_MAX);
                db.execSQL("DROP TABLE IF EXISTS " + TB_WOMAN_MAX);
            }finally {
                db.endTransaction();
            }
            onCreate(db);
        }

        public void setDataToDB(String defaultData1, String defaultData2, Uri uri) {
            ContentValues values = new ContentValues();
            values.put(COLUMN_VOICE, defaultData1);
            values.put(COLUMN_VOICE, defaultData2);
            getContext().getContentResolver().insert(uri, values);
        }
    }

解決

Android開発初心者向け – Content Providerの使い方を読みつつ、
勉強させていただいている中で気づいたのですが、
setDataToDBで使用しているContent Providerのinsert()の実装で
SQLiteDatabase db = mDBHelper.getWritableDatabase()みたいなことを
していませんか。

DBHelperは複数のDBインタンスを中に持てないため、
質問にあるような実装をDBHelper内で行うと、DBのインスタンスが複数→lockかかってるからエラーで落とすわとなります。おそらく。

対処としてはonCreateの中にsetDataToDBの処理を書かないで
外に実装を出すことかなぁ。

回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *