データ永続化
アプリを閉じても消えないようにする。
選択肢#
| 手段 | 適する対象 | 例 |
|---|---|---|
| キーバリュー | 設定、フラグ | UserDefaults、localStorage |
| ファイル | まとまったデータ、画像 | JSON、Plist |
| 組み込み DB | 構造化データ、検索が要る | SQLite、SwiftData |
| キーチェーン | 秘密情報 | トークン、パスワード |
| サーバ | 端末をまたぐデータ | API |
判断の目安#
数個の設定値 → キーバリュー
数百件・検索が要る → データベース
秘密情報 → キーチェーン(他に置いてはいけない)
端末間で同期 → サーバ or CloudKitUserDefaults に認証トークンを入れてはいけない。 暗号化されておらず、バックアップにも平文で含まれる。
スキーマの変更#
保存形式は必ず変わる。 最初から移行の手順を考えておく必要がある。
| 方針 | 内容 |
|---|---|
| バージョン番号を持つ | 段階的に変換する |
| 追加のみ | 既存フィールドを消さない |
| 前方互換 | 知らないフィールドを無視する |
すでに配布したアプリのデータは消せない。 古いバージョンから直接最新へ移行できる経路が要る。
整合性#
書き込みの途中でアプリが落ちると壊れる。
- 一時ファイルに書いてからアトミックに置き換える
- DB のトランザクションを使う
「書き込み中に電源が落ちる」は稀に見えて、 利用者が多ければ必ず起きる。
参考文献#
- Apple. Data persistence(Core Data / SwiftData / files). https://developer.apple.com/documentation/coredata
- SQLite. How To Corrupt An SQLite Database File. https://www.sqlite.org/howtocorrupt.html
- Martin Kleppmann. Designing Data-Intensive Applications. O’Reilly, 2017.