Web的な何か

JavaとかPHPとかやってます。最近はAndroidばっかやってます。

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使うことあんまりない気もするけどなんとなく書いてみた。