Android開発 | SQLiteOpenHelperのonCreateやonUpgradeの実行タイミング
2017/07/04
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などが呼ばれて処理が長くなるとエラーが発生する
...
}
}