SQLiteOpenHelperのonCreateやonUpgradeの実行タイミングをアプリ起動時かと思っていたのですが、実は起動時に呼び出されるものではなく、それで少し苦戦したため備忘録を残します。

SQLiteOpenHelperのonCreate/onUpgradeの実行タイミングはデータベース取得時

SQLiteOpenHelperを継承したクラスは、初回呼び出し時やバージョンアップ時にonCreateやonUpgradeが呼び出されます。厳密にはSQLiteOpenHelperのgetWritableDatabaseやgetReadableDatabaseの初回呼び出し時になります。

onCreateやonUpgrade内で時間のかかる処理を行う際は非同期に

SQLiteOpenHelperを継承したクラスのonCreateやonUpgrade内で時間のかかるテーブル操作がある場合、UIスレッドからDBアクセスを行うと、初回呼び出し時に処理が長くなってしまいエラーとなってしまうことがあります。(UIスレッドは処理に時間がかかるとエラーとなり強制終了されるため)

そのため、onCreateやonUpgrade内で時間のかかる処理を行う場合はAsyncTaskなどを使って非同期かを行います。

例)

public class DbTest extends SQLiteOpenHelper {
  ...
  @Override
  public void onCreate(SQLiteDatabase db) {
    //時間のかかるテーブル操作(大量insertなど)
  }
}

 

public class SampleActivity extends Activity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    DbTest dbTest = new DbTest();
    dbTest.getWritableDatabase(); // ここでonCreateなどが呼ばれて処理が長くなるとエラーが発生する
    ...
  }
}