SQLiteOpenHelperのonCreate内でAsyncTaskを使用してinsertする時の注意点
久しぶりに更新します。
SQLiteOpenHelperを継承したクラスのonCreate内で、AsyncTaskを使ってSQLiteにテストデータをinsertする処理を書いていたら、SQLiteDatabaseのところでNullPointerExceptionで落ちてしまった。
大まかなコードはこんな感じ
@Override public void onCreate(final SQLiteDatabase db) { ~Create Table~ new AsyncTask<Void, Void, List<Entry>> (){ @Override protected List<Entry> doInBackground(Void... params){ return 非同期で行う処理; } @Override protected void onPostExecute(List<Entry> result) { ContentValues values = new ContentValues(); values.put("id", result.getId()); values.put("title", result.getTitle()); db.insert(TABLE_NAME, null, value); } }.execute(); }
これで実行するとdb.insert(TABLE_NAME, null, value);の行でNullPointerExceptionが起きたので以下のような感じに修正してみた。
@Override public void onCreate(final SQLiteDatabase db) { ~Create Table~ new AsyncTask<Void, Void, List<Entry>> (){ @Override protected List<Entry> doInBackground(Void... params){ return 非同期で行う処理; } @Override protected void onPostExecute(List<Entry> result) { ContentValues values = new ContentValues(); values.put("id", result.getId()); values.put("title", result.getTitle()); getWritableDatabase().insert(TABLE_NAME, null, value); } }.execute(); }
原因はよくわかってないけど、onCreate後に引数で渡されてるSQLiteDatabaseがcloseされたりしているなかなと思ってgetWritableDatabaseでSQLiteDatabaseを呼び出したら動いた。
SQLiteOpenHelper内でAsyncTask使うことあんまりない気もするけどなんとなく書いてみた。