RORK LABEN
APPLE-AI — Appleが初回DL 200万未満の開発者にFoundation Modelsを無償開放。個人開発アプリへのAI組み込みコストが大幅に低下SWIFT-API — Foundation Modelsのサーバーサイド統合で、ClaudeやGeminiを同一Swift APIから呼び出し可能に。画像入力にも対応KOTLIN-MIGRATION — Android Studioの移行エージェントがReact Native製アプリをネイティブKotlinへ自動移行。Rork生成アプリの将来の選択肢にRORK-MAX — Rork MaxはネイティブSwiftコードを生成(月$200)。iPhone・iPad・Watch・TV・Vision Pro・iMessageまで対応SIMULATOR — ブラウザベースのストリーミングiOSシミュレータで、XcodeやMacなしに実機相当のApple環境で検証可能SWIFTUI — WWDC 2026でSwiftUIが進化。並べ替え可能コンテナ・任意コンテナのスワイプアクション・最大2倍速のレイアウトAPPLE-AI — Appleが初回DL 200万未満の開発者にFoundation Modelsを無償開放。個人開発アプリへのAI組み込みコストが大幅に低下SWIFT-API — Foundation Modelsのサーバーサイド統合で、ClaudeやGeminiを同一Swift APIから呼び出し可能に。画像入力にも対応KOTLIN-MIGRATION — Android Studioの移行エージェントがReact Native製アプリをネイティブKotlinへ自動移行。Rork生成アプリの将来の選択肢にRORK-MAX — Rork MaxはネイティブSwiftコードを生成(月$200)。iPhone・iPad・Watch・TV・Vision Pro・iMessageまで対応SIMULATOR — ブラウザベースのストリーミングiOSシミュレータで、XcodeやMacなしに実機相当のApple環境で検証可能SWIFTUI — WWDC 2026でSwiftUIが進化。並べ替え可能コンテナ・任意コンテナのスワイプアクション・最大2倍速のレイアウト
記事一覧/開発ツール
開発ツール/2026-06-12上級

アップデートでお気に入りを消さないために — Rork 製アプリのローカルデータ・マイグレーション設計

「アップデートしたらお気に入りが消えた」という星1レビューを受け取らないための設計です。封筒形式とスキーマバージョン、マイグレーションランナーの実装、EAS Update をスキーマ中立に保つ運用ルールまでを実体験から整理しました。

Rork381AsyncStorage9データ移行EAS Update4長期運用3

プレミアム記事

去年の冬、運用中の壁紙アプリをアップデートした翌朝、星1のレビューが2件届いていました。文面はどちらもほぼ同じです。「お気に入りが全部消えた」。

原因は、保存形式の変更でした。お気に入りを AsyncStorage に壁紙 ID の配列(string[])として保存していたものを、追加日時を持たせたオブジェクトの配列に変えたのです。新しいコードは新しい形しか読めず、旧形式のデータを初期値で上書きしました。ユーザーが何ヶ月もかけて集めたお気に入りは、私が書いた10行ほどの変更で消えたことになります。

サーバーのデータベースなら、こうはなりません。マイグレーションを書き、デプロイ前に流し、失敗したらロールバックする。その規律が当たり前のものとして共有されています。ところが端末の中のローカルデータには、同じ規律を持ち込まないまま運用してしまっているアプリが意外なほど多いのです。私自身のアプリも、そうでした。

この出来事のあと、私は Rork で作るアプリすべてに共通のマイグレーション層を入れる設計へ切り替えました。ここに書くのは、その実装の全文と、複数アプリを長く運用する中で固まった運用ルールです。

ローカルデータがサーバー DB より壊れやすい理由

サーバー DB のマイグレーションは「1つのデータベース」に「1回」適用すれば終わります。ローカルデータは違います。ユーザーの端末の数だけデータベースがあり、それぞれが別々のタイミングで、別々のバージョンから移行してきます。3世代前のバージョンから一気に最新へ上げる端末も、珍しくありません。

しかも、こちらからは触れません。SSH できる本番サーバーは存在せず、壊れたデータを直す手段は「次のアップデートに修復コードを同梱する」ことだけです。修復コードが届く頃には、ユーザーはとっくにアプリを消しているかもしれません。個人開発では、その問い合わせを受ける窓口も自分です。

Expo 基盤の Rork 製アプリには、もう1つ固有の事情があります。EAS Update による OTA 配信です。ストア審査を通さずに JS だけを差し替えられるのは大きな利点ですが、「コードは新しく、データは古い」という状態が発生する頻度も上がります。さらに OTA はロールバックも一瞬なので、「コードは古く、データは新しい」という逆向きの不整合まで起こり得ます。

そして Rork のような AI ビルダーで開発していると、状態の形そのものが頻繁に変わります。「お気に入りに追加日時を持たせてください」と一言頼めば、Rork は型も UI も一気に書き換えてくれます。ただし、端末に既に保存されている旧形式のデータのことは、こちらが言わなければ考慮してくれません。コードを変える速度が上がるほど、データとコードの形がずれる機会は増えます。ローカルデータの規律を最初に整えておくべき理由は、ここにあります。

設計の核は整数1つ — 封筒形式とスキーマバージョン

私が全アプリで採用しているのは、保存する JSON を必ず「封筒」に入れるという単純な決まりです。

{ "v": 3, "data": [{ "id": "w_201", "addedAt": 1749690000000 }] }

中身(data)の形は何度でも変わって構いません。その代わり、形を変えるときは封筒のバージョン番号 v を1つ上げ、「v2 の data を v3 の data に変換する関数」を必ず1本書きます。読み込み時は、保存されていた v から現在の v まで変換関数を順番に適用する。設計はこれだけです。

ポイントは、バージョンをキー名に埋め込まないことです。favorites_v2 のようなキーを切り始めると、古いキーの掃除と移行の管理が二重になり、どのキーが正なのかを誰も言えなくなります。キーは1つに固定し、封筒の中の整数だけを進める。この形がいちばん事故が起きにくいと感じています。

なお、AsyncStorage・MMKV・SQLite のどれを選ぶかという手前の話はローカルストレージ3種の使い分けを整理した記事に書きましたので、ここでは「選んだ後」にデータをどう守るかに集中します。

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
AsyncStorage を封筒形式+整数バージョンで守るマイグレーションランナーの完全な TypeScript 実装
EAS Update(OTA)にスキーマ変更を載せない運用境界と、その根拠になったロールバック事故のシナリオ
退避データの保持期間・旧マイグレーション関数の削除時期をデータで決める計測手法
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Rork Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

開発ツール2026-05-29
Rork × EAS Update の Runtime Version 戦略 — 6 アプリ並行運用で既存ユーザーを壊さない SDK アップグレード設計
Rork で作った 6 つのアプリを並行運用しながら Expo SDK 50→51 を段階的に上げた実装を、runtimeVersion ポリシー比較・eas.json 完全版・配信スクリプト・本番事故からの復旧手順まで一気通貫で残します。
開発ツール2026-05-28
Rork で書いた 6 つの壁紙アプリで MMKV に移し替えた 3 週間の所感
壁紙アプリ 6 本で AsyncStorage から react-native-mmkv へ少しずつ移し替えてみた 3 週間分の手順と所感を、つまずいた点も含めて書き残します。2014年からの個人開発の現場感を踏まえて、判断のラインを共有します。
開発ツール2026-05-19
Rork で AsyncStorage に大容量データを保存すると Android で CursorWindow エラーが出る原因と対処
Rork(React Native)で AsyncStorage に大きな JSON や画像メタデータを保存すると Android で発生する Row too big to fit into CursorWindow エラーの原因と、MMKV・SQLite・分割保存・圧縮など複数の現実的な対処をまとめています。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →