SQLiteOpenHelper を使って Android アプリのデータベースを安全にアップグレードする方法
Android アプリにおけるデータベースバージョンアップと新しいテーブルの追加
データベースバージョン
SQLite データベースにはバージョン番号が設定できます。アプリ起動時に、データベースファイルのバージョンとアプリが想定するバージョンを比較し、必要に応じてデータベースのアップグレード処理を実行します。
データベースバージョンアップの手順
- データベースバージョンを上げる:
onCreate()
またはonUpgrade()
メソッド内で、データベースファイルのバージョン番号を更新します。 - アップグレード処理を実装する:
onUpgrade()
メソッド内で、古いバージョンのデータベースから新しいバージョンのデータベースへの移行処理を実装します。- テーブルの追加、削除、変更
- データの移行
- 新しいテーブルを追加する:
onCreate()
またはonUpgrade()
メソッド内で、新しいテーブルを作成する SQL クエリを実行します。
データベースバージョンアップのサンプルコード
public class MyOpenHelper extends SQLiteOpenHelper {
public static final int DATABASE_VERSION = 2;
public MyOpenHelper(Context context) {
super(context, "mydb", null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
// 初期化処理
db.execSQL("CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if (oldVersion < 2) {
// バージョン 1 から 2 へのアップグレード処理
db.execSQL("ALTER TABLE users ADD COLUMN age INTEGER");
}
}
}
注意点
- データベースバージョンアップ処理は、ユーザーのデータ損失を防ぐために慎重に行う必要があります。
- アプリのバージョンアップ前に、必ずバックアップを取るようにしてください。
- テスト環境でデータベースバージョンアップ処理を十分に検証してから、本番環境に適用してください。
- 上記は基本的な手順であり、複雑なデータベーススキーマ変更の場合は、より詳細な処理が必要になる場合があります。
- 必要に応じて、サードパーティライブラリなどを活用するのも有効です。
public class MyOpenHelper extends SQLiteOpenHelper {
public static final int DATABASE_VERSION = 2;
public MyOpenHelper(Context context) {
super(context, "mydb", null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
// 初期化処理
db.execSQL("CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if (oldVersion < 2) {
// バージョン 1 から 2 へのアップグレード処理
// テーブル users に age 列を追加
db.execSQL("ALTER TABLE users ADD COLUMN age INTEGER");
}
if (oldVersion < 3) {
// バージョン 2 から 3 へのアップグレード処理
// 新しいテーブル addresses を作成
db.execSQL("CREATE TABLE addresses (id INTEGER PRIMARY KEY, user_id INTEGER, address TEXT)");
}
}
}
- バージョン 1 から 2 へのアップグレード処理では、
users
テーブルにage
列を追加します。
onUpgrade()
メソッドは、古いバージョンから新しいバージョンへの移行処理を段階的に記述できます。
- 上記サンプルコードはあくまで基本的な例です。
データベースバージョンアップと新しいテーブル追加のその他の方法
複数の SQLiteOpenHelper クラスを使用する
- メリット:
- バージョンごとに独立したコード管理が可能
- 複雑なデータベーススキーマ変更にも対応しやすい
- デメリット:
- コード量が増加する
- 管理が複雑になる
SQL スクリプトファイルを使用する
データベースバージョンアップ処理を記述した SQL スクリプトファイルを用意し、onCreate()
または onUpgrade()
メソッド内で実行する方法です。
- メリット:
- コード量が削減できる
- バージョン管理が容易
- デメリット:
- テストが難しい
サードパーティライブラリを使用する
DBFlow や Realm などのサードパーティライブラリを使用する方法です。
- メリット:
- データベース操作を簡単に記述できる
- バージョン管理やスキーマ変更などの機能が提供される
- デメリット:
- ライブラリの学習コストがかかる
- アプリのサイズが大きくなる
上記の方法のいずれを選択するかは、データベーススキーマの複雑さや開発チームのスキルセットなどを考慮する必要があります。
- シンプルなデータベーススキーマの場合は、1. 複数の SQLiteOpenHelper クラスを使用する または 2. SQL スクリプトファイルを使用する のいずれかを選択するのが良いでしょう。
- 複雑なデータベーススキーマの場合は、3. サードパーティライブラリを使用することを検討すると良いでしょう。
android database sqlite