端末の中の SQLite(Room・Core Data・GRDB)。アプリの更新時にスキーマを移行する。
アプリの端末内の DB は、ほとんどが SQLite(ファイル1つで動く小さな DB)です。Android では Room、iOS では SwiftData・Core Data・GRDB などがその上に乗っています。サーバーの DB と違い、利用者の端末ごとにばらばらの版の DB があるのが難しいところです。
user_version とマイグレーション
SQLite には、DB ファイルの中に数字を1つ持てる PRAGMA user_version があります。これを「スキーマの版」として使い、起動時に今の版を見て、足りない分の変更を順番に流します。これがマイグレーションです。Room は @Database(version = N) の版をこの仕組みで管理し、Migration(1, 2) のように1段ずつ書きます。
PRAGMA user_version; -- 今の版(例:2)
BEGIN;
ALTER TABLE notes ADD COLUMN pinned INTEGER NOT NULL DEFAULT 0;
PRAGMA user_version = 3;
COMMIT;| 注意点 | 理由・対策 |
|---|---|
| どの版からでも最新にできるようにする | 何か月も更新しなかった人は 1 → 5 のように飛んでくる。1段ずつの変更を全部残す |
| 変更はトランザクションで包む | 途中でアプリが落ちても、中途半端な DB が残らない |
| 「消して作り直す」で逃げない | Room の fallbackToDestructiveMigration は、送っていない下書きなど利用者のデータまで消える |
| 古い版から更新するテストをする | Room は版ごとのスキーマを書き出して、マイグレーションを試すテストが書ける |
面接ではこう答える
アプリの端末内の DB はほとんどが SQLite で、Android では Room、iOS では SwiftData や Core Data、GRDB などがその上に乗っています。サーバーの DB と違い、利用者の端末ごとにばらばらの版の DB があるので、PRAGMA user_version などでスキーマの版を持ち、起動時に足りない分の変更を順番に流すマイグレーションを書きます。どの版からでも最新にできるよう1段ずつの変更をすべて残し、トランザクションで包み、古い版から更新するテストをします。
Appとの関わりアプリの更新で利用者のデータを壊さないための基本で、DB の変更を含むリリースのたびに使います。
DBラボを読み込んでいます…