React Native を使用するときにデータを保存するためのオプションは何ですか? (iOS および Android) [closed] 質問する

React Native を使用するときにデータを保存するためのオプションは何ですか? (iOS および Android) [closed] 質問する

私は React Native の世界、そして一般的にはモバイル/ネイティブの世界でもまだ初心者なので、データの永続性に関してはドキュメントが少し不足していると感じています。

React Native でデータを保存するためのオプションと、各タイプの意味は何ですか? たとえば、ローカル ストレージと非同期ストレージがあることはわかりますが、Realm のようなものも見てみると、これらすべてが外部データベースでどのように機能するのかわかりません。

特に知りたいのは:

  • データの永続性にはどのようなオプションがありますか?
  • それぞれについて、その永続性の制限は何ですか (つまり、データが利用できなくなるのはいつですか)? たとえば、アプリケーションを閉じるとき、電話を再起動するときなどです。
  • それぞれについて、iOS と Android での実装には違いがありますか (一般的な設定以外)?
  • オフラインでデータにアクセスするためのオプションはどのように比較されますか? (または、オフライン アクセスは通常どのように処理されますか?)
  • 他に留意すべき点はありますか?

ご協力いただきありがとうございます!

ベストアンサー1

ここでは、現在取り組んでいるいくつかのアプリ プロジェクトを進めるための最善の方法を決定する際に私が学んだことを紹介します。

非同期ストレージ(以前は React Native に「組み込まれていた」が、現在は独自に移動されました)

私は運用中のアプリに AsyncStorage を使用しています。ストレージはデバイスにローカルに残り、暗号化されず (別の回答で述べたように)、アプリを削除すると消えますが、デバイスのバックアップの一部として保存され、アップグレード中も保持されます (TestFlight のようなネイティブ アップグレードと CodePush によるコード アップグレードの両方)。

結論: ローカル ストレージ。独自の同期/バックアップ ソリューションを提供します。

SQLite

私が携わった他のプロジェクトでは、アプリのストレージに sqlite3 を使用しました。これにより、デバイスとの間で送受信も可能な圧縮可能なデータベースを使用して、SQL のようなエクスペリエンスを実現できます。バックエンドに同期した経験はありませんが、さまざまなライブラリが存在すると思います。SQLite に接続するための RN ライブラリがあります。

データは、データベース、テーブル、キー、インデックスなど、従来のデータベース形式で保存され、すべてバイナリ形式でディスクに保存されます。コマンド ラインまたは SQLite ドライバーを備えたアプリを介して、データに直接アクセスできます。

結論: ローカル ストレージ。同期とバックアップを提供します。

ファイアベース

Firebase は、リアルタイムの NoSQL データベースと、1 から n までのクライアントを同期させるための JSON ドキュメント ストア (MongoDB など) を提供します。ドキュメントではオフラインの永続性について説明していますが、ネイティブ コード (Swift/Obj-C、Java) のみを対象としています。React Native で使用される Google 独自の JavaScript オプション (「Web」) では、キャッシュ ストレージ オプションは提供されません (以下の 2/18 更新を参照)。ライブラリは、Web ブラウザが接続することを前提として記述されているため、半永続的な接続になります。Firebase ストレージ呼び出しを補完するローカル キャッシュ メカニズムを記述するか、ネイティブ ライブラリと React Native 間のブリッジを記述することができます。

2018年2月更新私はその後リアクトネイティブFirebaseこれはネイティブの iOS および Android ライブラリに互換性のある JavaScript インターフェースを提供し (Google がおそらく実行できた/実行すべきだったこと)、ネイティブ ライブラリのすべての利点に加えて React Native サポートも提供します。Google がリアルタイム データベースの他に JSON ドキュメント ストアを導入したことで、私は構築を計画しているいくつかのリアルタイム アプリで Firebase をもう一度検討するようになりました。

リアルタイム データベースは JSON のようなツリーとして保存され、Web サイトで編集したり、簡単にインポート/エクスポートしたりできます。

結論: react-native-firebase を使用すると、RN は Swift や Java と同じメリットを得られます。[/update] ネットワーク接続デバイスに適切に拡張できます。使用率が低い場合のコストが低くなります。他の Google クラウド サービスとうまく組み合わせることができます。データはインターフェースから簡単に表示および編集できます。

レルム

2020 年 4 月更新MongoDB は Realm を買収し、MongoDB Stitch (後述) と統合する予定です。これはとても面白そうだ

2020 年 9 月更新Realm と Stitch を比較すると、Stitch API を使用すると、基本的に、JS アプリ (React Native または Web) が、自分で構築した API サーバーを経由せずに、Mongo データベースと直接通信できるようになります。

Realm は、変更が行われるたびにデータベースの一部を同期することを目的としていました。

2 つを組み合わせると、少し混乱します。以前は Stitch API と呼ばれていたものは、従来の Mongo クエリや更新呼び出しのように動作しますが、新しい Realm のものはコード内のオブジェクトにアタッチされ、同期をすべて独自に処理します... ほとんどの場合。私はまだ、SwiftUI を使用する 1 つのプロジェクトで物事を実行する正しい方法を模索中なので、少し話題から外れています。しかし、それでも有望で素晴らしいものです。


また、自動ネットワーク同期機能を備えたリアルタイム オブジェクト ストアです。同社は「デバイス ファースト」を売りにしており、デモ ビデオでは、デバイスが散発的または損失の多いネットワーク接続を処理する方法を紹介しています。

独自のサーバーまたは AWS や Azure などのクラウド ソリューションでホストするオブジェクト ストアの無料バ​​ージョンを提供しています。デバイスに保持されないインメモリ ストア、サーバーと同期しないデバイス専用ストア、読み取り専用サーバー ストア、1 台以上のデバイス間で同期するための完全な読み取り/書き込みオプションも作成できます。プロフェッショナル オプションとエンタープライズ オプションがあり、月額の初期費用は Firebase よりも高くなります。

Firebase とは異なり、すべての Realm 機能は、Swift/ObjC/Java (ネイティブ) アプリと同様に、React Native および Xamarin でもサポートされています。

データはコード内のオブジェクトに関連付けられています。定義済みオブジェクトであるため、スキーマがあり、コードの健全性を保つためにバージョン管理が必須です。Realm が提供する GUI ツールを介して直接アクセスできます。デバイス上のデータ ファイルはクロスプラットフォームと互換性があります。

結論: デバイス優先、無料および有料プランでのオプションの同期。すべての機能は React Native でサポートされています。水平スケーリングは Firebase よりも高価です。

アイクラウド

正直言って、まだこのゲームであまり遊んでいませんが、近い将来に遊ぶつもりです。

CloudKit を使用するネイティブ アプリがある場合は、CloudKit JS を使用して、Web アプリ (または、この場合は React Native) からアプリのコンテナーに接続できます。このシナリオでは、ネイティブ iOS アプリと React Native Android アプリがあると考えられます。

Realm と同様に、これはデータをローカルに保存し、可能な場合は iCloud に同期します。アプリ用のパブリック ストアと、顧客ごとにプライベート ストアがあります。顧客は、ストアやオブジェクトの一部を他のユーザーと共有することもできます。

生データにアクセスするのがどれだけ簡単かはわかりませんが、スキーマは Apple のサイトで設定できます。

結論: Apple 向けアプリに最適です。

カウチベース

有名企業が多く、多くの大企業がサポートしています。標準サポート費用で、コミュニティ エディションとエンタープライズ エディションがあります。

彼らのサイトには、React Native に接続するためのチュートリアルがあります。私もこれにあまり時間を費やしていませんが、機能面では Realm の代替として実行可能なようです。アプリや構築した API の外部にあるデータにどれほど簡単にアクセスできるかはわかりません。

[編集: CouchbaseとCouchDBについて言及している古いリンクを見つけました。CouchDBも検討すべきもう1つの選択肢かもしれません。この2つは歴史的には関連していますが、現在ではまったく異なる製品です。この比較

結論: Realm と同様の機能があるようです。デバイスのみ、または同期できます。試してみる必要があります。

モンゴDB

2020年4月更新

MongoはRealmを買収し、MongoDB Stitchと統合する計画(後述) と Realm (前述) を組み合わせます。


私は、AsyncStorage をローカルで使用するアプリの一部にこのサーバー側を使用しています。すべてが JSON オブジェクトとして保存され、クライアント デバイスへの転送が非常に簡単になる点が気に入っています。私の使用例では、TV ガイド データの上流プロバイダーとクライアント デバイス間のキャッシュとして使用されています。

データにはスキーマのようなハード構造がないため、すべてのオブジェクトは簡単に検索、フィルタリングできる「ドキュメント」として保存されます。同様の JSON オブジェクトには追加の (ただし異なる) 属性または子オブジェクトが存在する可能性があり、オブジェクト/データの構造化方法に高い柔軟性がもたらされます。

クライアントからサーバーへの同期機能を試したことはなく、組み込みで使用したことはありません。MongoDB 用の React Native コードは存在します。

結論: ローカルのみの NoSQL ソリューションであり、Realm や Firebase のような明らかな同期オプションはありません。

2019年2月更新

MongoDB には Stitch という「製品」(またはサービス) があります。クライアント (Web ブラウザーや電話) は MongoDB と直接通信すべきではないため (サーバー上のコードによって実行されます)、MongoDB はホスト型ソリューション (Atlas) を使用する場合にアプリがインターフェイスできるサーバーレス フロントエンドを作成しました。ドキュメントによると、同期オプションが可能であるようです。

2018年12月のこの記事では、サンプルアプリでReact Native、Stitch、MongoDBを使用する方法について説明しており、他のサンプルもドキュメントにリンクされています(https://www.mongodb.com/blog/post/building-ios-and-android-apps-with-the-mongodb-stitch-react-native-sdk)。

Twilio 同期

同期のためのもう 1 つの NoSQL オプションは、Twilio の Sync です。同社の Web サイトには、「Sync を使用すると、バックエンド インフラストラクチャを処理することなく、任意の数のデバイスの状態をリアルタイムで大規模に管理できます。」と記載されています。

私は、前述のプロジェクトの 1 つで、Firebase の代替としてこれを検討しました。特に、両方のチームと話し合った後です。他のコミュニケーション ツールも気に入っており、シンプルな Web アプリから更新情報をテキストで送信するために使用しました。


[編集] 最初にこれを書いてから、Realm に少し時間を費やしました。Firebase のように、アプリとサーバーの間でデータを同期するための API を書く必要がないのが気に入っています。サーバーレス関数も、これら 2 つで非常に役立ち、記述する必要があるバックエンド コードの量を制限します。

私は MongoDB データ ストアの柔軟性が気に入っており、Web ベースやその他の接続を必要とするアプリのサーバー側では MongoDB データ ストアを選択するようになっています。

私は見つけたRESTHeart(レストハート)は、MongoDB への非常にシンプルでスケーラブルな RESTful API を作成します。JSON オブジェクトを RESTHeart に読み書きし、MongoDB との間でやり取りする React (ネイティブ) コンポーネントを構築するのはそれほど難しくないはずです。


[編集] データの保存方法についての情報を追加しました。開発とテスト中にデータを調整してテストする必要がある場合、どの程度の作業が必要になるかを知っておくことは重要です。


2019 年 2 月の編集昨年 (2018 年)、高同時実行プロジェクトを設計する際に、これらのオプションのいくつかを試しました。ドキュメントには、同時実行のハード制限とソフト制限が記載されているものもあります (AltConf での両チームの議論によると、Firebase には 10,000 接続のハード制限があり、Twilio には引き上げ可能なソフト制限がありました)。

数万から数十万のユーザー向けのアプリを設計している場合は、それに応じてデータ バックエンドを拡張する準備をしてください。

おすすめ記事