RORK LABEN
PLAY — Google Play の target API level 36 要件が昨日8月31日に発効しました。今日以降、新規アプリと既存アプリの更新は Android 16 対応が必須ですVISIBILITY — API 35 のままのアプリは掲載こそ続きますが、新しい Android 版のユーザーには表示されなくなります。エラーが出ないまま新規インストールだけが減る点に注意が要りますEXTENSION — 間に合わなかった場合は、Play Console から2026年11月1日までの延長申請が出せます。恒久対応の計画とセットで進めるのが実務的ですAPPLE — Apple 側は9月9日にイベント、iOS 27 の正式リリースは9月14日と報じられています。生成したアプリの iOS 27 実機確認はリリース週の前に済ませておきたいところですEXPO — Expo が expo-paste-input を公開しました(8月28日)。React Native の TextInput に画像・GIF・ステッカーの貼り付けを追加するネイティブモジュールですEAS — EAS Observe が8月20日に GA になりました。クラッシュや性能の観測を、ビルドや配信と同じ EAS 上で持てるようになっていますPLAY — Google Play の target API level 36 要件が昨日8月31日に発効しました。今日以降、新規アプリと既存アプリの更新は Android 16 対応が必須ですVISIBILITY — API 35 のままのアプリは掲載こそ続きますが、新しい Android 版のユーザーには表示されなくなります。エラーが出ないまま新規インストールだけが減る点に注意が要りますEXTENSION — 間に合わなかった場合は、Play Console から2026年11月1日までの延長申請が出せます。恒久対応の計画とセットで進めるのが実務的ですAPPLE — Apple 側は9月9日にイベント、iOS 27 の正式リリースは9月14日と報じられています。生成したアプリの iOS 27 実機確認はリリース週の前に済ませておきたいところですEXPO — Expo が expo-paste-input を公開しました(8月28日)。React Native の TextInput に画像・GIF・ステッカーの貼り付けを追加するネイティブモジュールですEAS — EAS Observe が8月20日に GA になりました。クラッシュや性能の観測を、ビルドや配信と同じ EAS 上で持てるようになっています
記事一覧/開発ツール
開発ツール/2026-03-29中級

Rork アプリのローカルデータ永続化 — AsyncStorage・MMKV・SQLite を実測で選び分ける

Rork アプリのローカルストレージを AsyncStorage・MMKV・SQLite で実測比較。移行手順、MMKV の落とし穴、SQLite を一括投入で数十倍速くする WAL + トランザクション設計まで、個人開発の実体験をもとに解説します。

Rork547AsyncStorage10MMKV6SQLite4ローカルストレージ2データ永続化2React Native233

プレミアム記事

一覧画面が一瞬固まった、あの夜のこと

個人開発で運用しているアプリに、お気に入り登録の機能を足したときのことです。数百件までは何の問題もなく動いていたのに、ヘビーユーザーの端末でお気に入りが数千件に達したあたりから、一覧を開くたびに画面が一瞬白くなる、という報告が届きました。

原因は、起動時にお気に入り一覧をまるごと AsyncStorage から読み込み、JSON.parse で巨大な配列を毎回展開していたことでした。保存していたのはただのキーバリューなのに、データが育つほど起動が重くなる。当時の私は「ストレージは後で考えればいい」と高をくくっていて、その油断がそのまま体感速度の劣化として返ってきたわけです。

ローカルストレージの選択は、アプリが小さいうちは何を選んでも違いが出ません。差が出るのは、ユーザーのデータが育ってからです。だからこそ、最初に仕組みを理解して選んでおくと、後からの作り直しを避けられます。

ここでは React Native / Expo ベースの Rork アプリで使える三つの定番 — AsyncStorageMMKVSQLite — を、速度の出る理由・出ない理由まで踏み込んで比較します。単なる紹介ではなく、移行手順や落とし穴、そして「遅い SQLite」を「速い SQLite」に変える実装まで、実際につまずいた経験をもとにお伝えします。

AsyncStorage — まず動かすための最短ストア

AsyncStorage は React Native コミュニティが保守するキーバリュー型ストレージです。Rork が生成するプロジェクトでもそのまま使いやすく、学習コストはほぼゼロに近いのが魅力です。

  • データ形式: 文字列のキーバリュー(JSON.stringify でオブジェクトも保存可能)
  • API: すべて Promise ベースの非同期
  • バックエンド: Android は SQLite(デフォルト6MB上限)、iOS は plist ファイル
  • スレッド安全性: 内部でシリアライズされるため並行アクセスでも安全
import AsyncStorage from '@react-native-async-storage/async-storage';
 
// ユーザー設定を保存する
const saveUserPreferences = async (preferences: {
  theme: 'light' | 'dark';
  language: string;
  notifications: boolean;
}) => {
  try {
    const jsonValue = JSON.stringify(preferences);
    await AsyncStorage.setItem('@user_preferences', jsonValue);
    console.log('設定を保存しました');
  } catch (error) {
    console.error('保存に失敗しました:', error);
  }
};
 
// ユーザー設定を読み込む
const loadUserPreferences = async () => {
  try {
    const jsonValue = await AsyncStorage.getItem('@user_preferences');
    if (jsonValue !== null) {
      return JSON.parse(jsonValue);
    }
    return { theme: 'light', language: 'ja', notifications: true };
  } catch (error) {
    console.error('読み込みに失敗しました:', error);
    return null;
  }
};
 
// 期待される出力:
// saveUserPreferences({ theme: 'dark', language: 'ja', notifications: true })
// => "設定を保存しました"
// loadUserPreferences()
// => { theme: 'dark', language: 'ja', notifications: true }

設定値・フラグ・トークンの一時保存・数十件程度のキャッシュ、そして MVP 段階のアプリには、これで十分です。私自身、新しいアプリの最初の数週間はほぼ AsyncStorage だけで進めます。判断を早く回すフェーズで、ストレージの設計に時間を取られたくないからです。

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

この記事の続きを読む

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

この記事で得られること
AsyncStorage が遅くなる仕組みと、MMKV へ無停止で移行するワンタイム移行コード
SQLite の一括投入をトランザクション + WAL で約30倍速くする実装と実測値
データの性質から AsyncStorage / MMKV / SQLite を即決できる判断フロー
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

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

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

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

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

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

関連記事

開発ツール2026-05-19
Rork で AsyncStorage に大容量データを保存すると Android で CursorWindow エラーが出る原因と対処
Rork(React Native)で AsyncStorage に大きな JSON や画像メタデータを保存すると Android で発生する Row too big to fit into CursorWindow エラーの原因と、MMKV・SQLite・分割保存・圧縮など複数の現実的な対処をまとめています。
開発ツール2026-04-20
Rork アプリのデータが消える・保存されない問題の原因と解決策
Rork アプリでデータが保存されない・再起動すると消えるという問題は、原因がいくつかのパターンに絞られます。AsyncStorage の使い方から非同期処理のタイミングバグまで、実際によく起こるケースを整理して解説します。
開発ツール2026-06-22
壊れたキャッシュで毎回起動時に落ちるアプリ——ユーザーが自力で抜け出せる「セーフモード起動」を設計する
永続化したキャッシュが壊れて起動のたびに同じ場所で落ちると、ユーザーには再インストールしか残りません。アプリ自身が早期クラッシュの連続を数え、対話可能になって初めて起動を確定し、危険な状態だけを段階的にリセットするセーフモードを、Expo(React Native)の実装で設計します。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →