RORK LABEN
BUILD — Rork Max はクラウド上の実機 Mac に Xcode と iOS SDK を載せ、SwiftUI を書き、ビルドし、エラーを読んで直す反復を回します。コードを吐いて終わりではない点が生成物の質に効いていますNATIVE — 生成されるのは React Native ではなく純粋な Swift / SwiftUI です。AR や Metal、ウィジェットなど React Native からは届かない機能に手が届くことが、他ビルダーとの実質的な差になりますPLATFORMS — 対応は iPhone・iPad・Apple Watch・Apple TV・Vision Pro に加えて iMessage まで含みます。ウォッチや拡張から入る設計を試すのに向いていますCOMPANION — Rork Companion により、有料の Apple Developer アカウントなしで生成したアプリを実機の iPhone で確認できます。最初の一本を試す段階の障壁が一段下がりましたPRICING — 無料で開始でき有料プランは月額25ドルから、Rork Max は月額200ドルの Max プランです。回収できる本数と規模を先に見積もっておく価値がありますDEADLINE — Google Play は2026年8月31日以降、新規アプリと更新の双方に対象 API レベル36 以上を要求します。残り10日で、生成物の targetSdkVersion は自分で確認が必要ですBUILD — Rork Max はクラウド上の実機 Mac に Xcode と iOS SDK を載せ、SwiftUI を書き、ビルドし、エラーを読んで直す反復を回します。コードを吐いて終わりではない点が生成物の質に効いていますNATIVE — 生成されるのは React Native ではなく純粋な Swift / SwiftUI です。AR や Metal、ウィジェットなど React Native からは届かない機能に手が届くことが、他ビルダーとの実質的な差になりますPLATFORMS — 対応は iPhone・iPad・Apple Watch・Apple TV・Vision Pro に加えて iMessage まで含みます。ウォッチや拡張から入る設計を試すのに向いていますCOMPANION — Rork Companion により、有料の Apple Developer アカウントなしで生成したアプリを実機の iPhone で確認できます。最初の一本を試す段階の障壁が一段下がりましたPRICING — 無料で開始でき有料プランは月額25ドルから、Rork Max は月額200ドルの Max プランです。回収できる本数と規模を先に見積もっておく価値がありますDEADLINE — Google Play は2026年8月31日以降、新規アプリと更新の双方に対象 API レベル36 以上を要求します。残り10日で、生成物の targetSdkVersion は自分で確認が必要です
記事一覧/開発ツール
開発ツール/2026-07-05上級

Rork 製アプリの expo-sqlite で、テーブル構造を変えてもデータを消さない — PRAGMA user_version で作る順次マイグレーション

「no such column」で起動直後に落ちる。テーブル構造を変えた新バージョンを既存ユーザーに配ると起きる事故です。expo-sqlite の PRAGMA user_version を使い、カラム追加・テーブル再構築・外部キーを含むスキーマ変更をユーザーデータを守りながら順に適用する設計を、実装の全文と運用ルールとしてまとめました。

Rork539expo-sqliteデータ移行2SQLite4長期運用11

プレミアム記事

新しいバージョンを配信した直後、Crashlytics に見覚えのないクラッシュが並びました。文面は no such column: added_at。手元のシミュレータでは一度も出ていません。落ちているのは、前のバージョンからアップデートしてきた既存ユーザーの端末だけでした。

原因はすぐに分かりました。新しいコードは SELECT id, wallpaper_id, added_at FROM favorites を実行します。ところが既存ユーザーの端末にある SQLite ファイルには、added_at という列がまだありません。新規インストールのユーザーは、アプリが最初に CREATE TABLE を流すので新しい列を持っています。だからストア審査も、私自身のテストも通ってしまう。差が出るのは「前のスキーマのファイルを持ったまま更新した人」だけなのです。

サーバーのデータベースなら、スキーマを変えるときにマイグレーションを書き、デプロイの一部として流します。端末の中の SQLite にも、同じ規律が要ります。キーバリューの移行についてはアップデートでお気に入りを消さないために — ローカルデータ・マイグレーション設計で書きましたが、リレーショナルな SQLite はテーブル構造そのものを変えるぶん、扱いがもう一段やっかいです。ここでは Rork で作るアプリに入れている、expo-sqlite 向けの順次マイグレーション層を実装の全文とともに整理します。

SQLite のマイグレーションが AsyncStorage より厄介な理由

AsyncStorage なら、保存した JSON を読み込んだ直後にコードで形を整えれば済みます。読み書きの境界が1箇所だからです。SQLite はそうはいきません。スキーマ(テーブルの定義)そのものが端末のファイルに焼き付いていて、コード側の期待とファイル側の実体がずれた瞬間に、クエリが実行時エラーで落ちます。

しかも SQLite の ALTER TABLE は限定的です。列の追加はできますが、列の削除や改名、制約(UNIQUENOT NULL)の変更は、素直な一文では書けません。テーブルをまるごと作り直す手続きが必要になります。この非対称性を知らずに「とりあえず ALTER TABLE で」と考えると、途中で手が止まります。

もう一つの落とし穴が、同じアプリでもユーザーごとにスキーマのバージョンがバラバラだという事実です。v1 のまま眠っていた端末が半年後に起動して、いきなり v4 のコードに出会うこともあります。だからマイグレーションは「1個ずつ順に適用でき、どのバージョンから始めても最新までたどり着ける」形でなければなりません。

設計の起点は PRAGMA user_version という整数1つ

SQLite には、データベースファイルのヘッダーに書き込める整数フィールドが最初から用意されています。PRAGMA user_version です。アプリはこの値を「このファイルのスキーマは今どこまで進んでいるか」を表す目盛りとして使えます。新規作成直後の DB では 0 です。

やることは単純です。アプリが知っている最新バージョン(マイグレーションの本数)と、ファイルの user_version を比べ、足りないぶんだけ順に流し、流すたびに user_version を1つ進める。これだけで、どの世代の端末も同じゴールに収束します。テーブルの中に自前のバージョン管理テーブルを作る方法もありますが、user_version はファイルに内蔵されていて追加のクエリが要らないぶん、私はこちらを好みます。

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

この記事の続きを読む

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

この記事で得られること
expo-sqlite の PRAGMA user_version を軸に、複数バージョンを順に埋めるマイグレーションランナーの完全な TypeScript 実装を手に入れられる
ALTER TABLE で足りるカラム追加と、12ステップのテーブル再構築が要る変更を見分けられるようになり、カラム削除・改名・制約変更を安全に流せる
外部キーとトランザクションが噛み合わずデータが欠ける事故を、foreign_keys を切る順番と foreign_key_check で未然に防げる
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

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

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

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

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

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

関連記事

開発ツール2026-06-12
アップデートでお気に入りを消さないために — Rork 製アプリのローカルデータ・マイグレーション設計
「アップデートしたらお気に入りが消えた」という星1レビューを受け取らないための設計です。封筒形式とスキーマバージョン、マイグレーションランナーの実装、EAS Update をスキーマ中立に保つ運用ルールまでを実体験から整理しました。
開発ツール2026-08-02
2文字の検索語が静かに0件になる — Expo アプリの日本語検索インデックスを実測で選び直す
SQLite FTS5 の trigram トークナイザは2文字以下の日本語クエリを例外なしで0件にします。2万件のカタログで線形走査・bigram 転置索引・FTS5 を実測し、索引を足すべき閾値と起動コストの実数を出した記録です。
開発ツール2026-07-27
最低サポート iOS をいつ上げるか — 利用率ではなく、コードに残った分岐の数で決める
最低サポート OS の引き上げを利用率で判断すると、毎年同じ結論になって先送りが続きます。OS 分岐に注記を付けて棚卸しし、引き上げ先ごとに消せる分岐を数えるスクリプトと、引き上げ後に見る指標をまとめました。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →