[解決済み】React Nativeを使用する際のデータ保存のオプションは何ですか?(iOSとAndroid) [終了しました]。
質問
私はReact Nativeの世界ではまだ新人で、一般的にモバイル/ネイティブの世界でもそうですが、データの永続化に関してはドキュメントが少し欠けていると感じています。
React Nativeでデータを保存するための選択肢と、それぞれのタイプの意味するところは何ですか?例えば、ローカルストレージや非同期ストレージがあるのはわかりますが、Realmのようなものもあり、これらが外部のデータベースとどのように連携するのか混乱しています。
具体的に知りたいのは
- データ永続化のオプションにはどのようなものがありますか?
- それぞれについて、その永続性の限界(つまり、いつデータが使えなくなるか)を教えてください。例:アプリケーションを閉じたとき、携帯電話を再起動したとき、など。
- それぞれについて、iOSとAndroidで実装した場合の違いはありますか(一般的な設定以外に)?
- オフラインでデータにアクセスするためのオプションはどのように比較されますか?(または、オフライン・アクセスは通常どのように処理されますか?)
- その他に注意すべき点はありますか?
ご協力ありがとうございました。
解決方法は?
現在進行中のいくつかのアプリのプロジェクトを進める上で、最適な方法を決定するために学んだことを紹介します。
非同期ストレージ (以前はReact Nativeに"built-in"でしたが、現在は独自に移動しています)
私は運用中のアプリでAsyncStorageを使用しています。ストレージはデバイスにローカルなままであり、暗号化されておらず(別の回答で述べたように)、アプリを削除すると消えてしまいますが、デバイスのバックアップの一部として保存され、アップグレード中(TestFlightとCodePushによるネイティブアップグレードの両方)持続されます。
結論 ローカルストレージ、同期/バックアップソリューションは自分で用意する。
SQLite
私が携わった他のプロジェクトでは、アプリのストレージにsqlite3が使われています。これは、SQLのようなエクスペリエンスを提供し、圧縮可能なデータベースで、デバイスとの間で転送することも可能です。 バックエンドに同期させた経験はありませんが、様々なライブラリが存在すると思います。 SQLiteに接続するためのRNライブラリがあります。
データは、データベース、テーブル、キー、インデックスなど、すべてバイナリ形式でディスクに保存される、従来のデータベース形式で保存されます。データへの直接アクセスは、コマンドラインやSQLiteドライバを持つアプリケーションで可能です。
結論 ローカルストレージ。同期とバックアップは自分で行う。
Firebase
Firebaseは、リアルタイムnoSQLデータベースとJSONドキュメントストア(MongoDBのような)を提供し、1~n個のクライアントを同期させることができる。ドキュメントには、オフラインの永続性について書かれているが、ネイティブコード(Swift/Obj-C, Java)のみである。React Nativeで使われているGoogle独自のJavaScriptオプション("Web")には、キャッシュストレージのオプションがありません(下記の2/18更新を参照)。このライブラリは、Webブラウザが接続することを前提に書かれているため、半永久的に接続が続くことになります。 Firebaseのストレージ呼び出しを補完するローカルキャッシュ機構を書くか、ネイティブライブラリとReact Nativeのブリッジを書けばいいのでしょう。
2018年2月更新 を見つけてから React Native Firebase これは、iOSとAndroidのネイティブライブラリに互換性のあるJavaScriptインターフェースを提供し(Googleがおそらくできた/すべきことをやっている)、ネイティブライブラリのすべての良さとReact Nativeサポートのボーナスを与えてくれるものです。Googleがリアルタイムデータベースの横にJSONドキュメントストアを導入したことで、私はFirebaseを、私が作る予定のリアルタイムアプリのために、もう一度よく見てみることにした。
リアルタイムデータベースは、JSONのようなツリーとして格納されており、ウェブサイト上で編集したり、インポート/エクスポートを簡単に行うことができます。
結論 react-native-firebaseで、RNはSwiftやJavaと同じメリットを得ることができます。[/update] ネットワークに接続されたデバイスのためによく拡張されます。低利用率で低コスト。Googleが提供する他のクラウドとうまく組み合わせることができる。Googleのインターフェイスから、データを容易に閲覧、編集できる。
レルム
アップデート 2020年4月 MongoDBはRealmを買収し、MongoDB Stitch(後述)と統合する予定です。 これは非常にエキサイティングなことです .
2020年9月20日更新 RealmとStitchを使った感想。 Stitch API は基本的に JS アプリ (React Native や Web) が自分で構築した API サーバーを経由せずに直接 Mongo データベースと対話することを可能にします。
Realmは、変更が加えられるたびにデータベースの一部を同期させるためのものでした。
この2つの組み合わせは、少し混乱します。旧来の Stitch API は従来の Mongo のクエリやアップデートの呼び出しと同じように動作しますが、新しい Realm API はコード内のオブジェクトにアタッチして、同期を単独で処理します...ほとんどね。私はまだ SwiftUI を使っているあるプロジェクトで正しいやり方を研究しているので、ちょっとトピックから外れてしまいますが。 しかし、それにもかかわらず、有望できちんとしたものです。
また、自動的なネットワーク同期を行うリアルタイム・オブジェクト・ストアでもあります。 デバイスファーストを謳い、デモビデオではデバイスが散発的なネットワーク接続やロスのあるネットワーク接続をどのように扱うかを見せています。
オブジェクトストアの無料版を提供しており、自分のサーバーやAWS、Azureなどのクラウドソリューションでホストすることができます。 また、デバイスと同期しないインメモリストア、サーバーと同期しないデバイス専用ストア、読み取り専用のサーバーストア、1台以上のデバイス間で同期する完全な読み取り/書き込みオプションを作成することができます。 プロフェッショナル版とエンタープライズ版があり、Firebaseよりも月額費用が高くなる。
Firebaseとは異なり、React NativeやXamarinでもSwift/ObjC/Java(ネイティブ)アプリと同様にRealmの全機能がサポートされています。
データはコードの中でオブジェクトに結びつきます。定義されたオブジェクトであるため、スキーマがあり、バージョン管理はコードの健全性のために必要です。Realm が提供する GUI ツールを使って直接アクセスすることができます。 デバイス上のデータファイルはクロスプラットフォームで互換性があります。
結論 デバイスファーストで、無料プランと有料プランで任意に同期が可能。React Nativeで全機能をサポート。 水平スケーリングはFirebaseより高い。
iCloud
正直なところ、まだあまり遊んでいないのですが、近いうちに遊んでみようと思っています。
CloudKitを使用するネイティブアプリがある場合、CloudKit JSを使用してWebアプリ(私たちの場合はReact Native)からアプリのコンテナに接続することが可能です。 このシナリオでは、おそらくネイティブのiOSアプリとReact NativeのAndroidアプリがあるはずです。
Realmと同様、ローカルにデータを保存し、可能な限りiCloudに同期させます。 アプリのパブリックストアと、顧客ごとのプライベートストアがあります。 顧客は、自分のストアやオブジェクトの一部を他のユーザーと共有することを選択することもできます。
生データへのアクセスがどの程度容易なのかはわからない。スキーマはAppleのサイトで設定することができる。
結論 Appleをターゲットにしたアプリには最適。
Couchbase
ビッグネームで、多くの大企業が背後にいる。 コミュニティ版とエンタープライズ版があり、標準的なサポート費用がかかります。
React Nativeに接続するためのチュートリアルが公開されています。 私もまだあまり時間をかけていませんが、機能的にはRealmの代替となりそうです。 アプリや構築したAPIの外からデータにアクセスするのがどれだけ簡単かはわからないが。
[編集:CouchbaseとCouchDBについて話す古いリンクを発見し、CouchDBは考慮すべきまだ別のオプションであるかもしれません。2は、歴史的に関連しているが、現在は完全に異なる製品です。 参照してください。 この比較 .]
結論から言うと Realmと同じような機能を持っているようです。端末のみ、または同期が可能。試してみないとわからない。
MongoDB
アップデート 2020年4月
MongoがRealmを買収し は、MongoDB Stitch を結合する予定です。 (後述)とRealm(前述)を組み合わせたものです。
私はこのサーバーサイドを、ローカルでAsyncStorageを使うアプリの一部で使っています。 すべてがJSONオブジェクトとして格納されるので、クライアントデバイスへの転送が非常に簡単になるのが気に入っています。 私の使用例では、TVガイドデータの上流プロバイダとクライアントデバイスの間のキャッシュとして使用しています。
データにはスキーマのような難しい構造はなく、すべてのオブジェクトは検索やフィルタリングなどが簡単にできる「ドキュメント」として格納されています。同様のJSONオブジェクトは、追加の(しかし異なる)属性や子オブジェクトを持つことができ、オブジェクトやデータをどのように構造化するか、非常に柔軟に対応することができます。
クライアントからサーバーへの同期機能は試していませんし、埋め込んで使ったこともありません。MongoDB用のReact Nativeのコードは存在します。
結論から言うと Realm や Firebase のような明白な同期オプションはありません。
2019年2月更新
MongoDBにはStitchという製品(サービス)があります。クライアント(ウェブブラウザや携帯電話など)は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シンク
同期のためのもう一つのNoSQLオプションは、TwilioのSyncです。彼らのサイトより。 Syncは、バックエンドのインフラストラクチャを処理することなく、リアルタイムでスケールの大きい、任意の数のデバイス間で状態を管理することができます。
特に両チームと話した後、前述のあるプロジェクトでFirebaseの代替品としてこれを検討しました。また、彼らの他のコミュニケーションツールも好きで、シンプルなウェブアプリから更新情報をテキストで送るために使用したこともあります。
[編集] 最初にこれを書いてから、Realmに少し時間を費やしました。Firebaseのように、アプリとサーバ間でデータを同期させるためのAPIを書く必要がないのはいいですね。サーバーレス機能は、私が書かなければならないバックエンドコードの量を制限するために、この2つで本当に役に立ちそうです。
私はMongoDBのデータストアの柔軟性が好きなので、ウェブベースやその他の接続が必要なアプリのサーバーサイドにはMongoDBを選択するようになってきています。
私が見つけたのは RESTHeart これは、MongoDBへの非常にシンプルでスケーラブルなRESTful APIを作成するものである。 JSONオブジェクトをRESTHeartに読み書きし、それをMongoDBに受け渡すReact(Native)コンポーネントを作るのは、それほど難しくないはずです。
[編集] データがどのように保存されているかについての情報を追加しました。データを微調整したりテストしたりする場合、開発やテスト中にどれだけの作業が必要になるかを知っておくことが重要な場合があります。
編集 2/2019 私はこの1年(2018年)、高同期性のプロジェクトを設計する際に、これらのオプションをいくつか実験してみました。それらのいくつかは、ドキュメントでハードとソフトの同時実行性制限に言及しています(AltConfでの両チームとの議論によると、Firebaseは確か1万接続でハード、Twilioはぶつけることができるソフト制限でした)。
数万から数十万人のユーザーを対象としたアプリを設計する場合は、それに応じてデータバックエンドを拡張する準備をしてください。
関連
-
[解決済み】Android Studioです。「プロジェクトが C ドライブに作成されている場合、「タスク ':app:mergeDebugResources' の実行に失敗しました。
-
[解決済み】起動アクティビティを特定できませんでした。デフォルトのアクティビティが見つかりませんでした
-
[解決済み】IllegalStateException: ViewPager で onSaveInstanceState の後にこのアクションを実行できません。
-
[解決済み] Androidのgravityとlayout_gravityの違いは何ですか?
-
[解決済み] Bitmapオブジェクトに画像を読み込む際にOutOfMemoryが発生する問題
-
[解決済み] アプリケーションを終了することは嫌われますか?
-
[解決済み] グリッドレイアウトにおけるフリングジェスチャーの検出
-
[解決済み] React NativeとReactの違いは何ですか?
-
[解決済み] AndroidでSQLiteを使用する際に、並行処理の問題を回避するにはどうすればよいですか?
-
[解決済み] React / React Nativeでコンストラクタを使用する場合とgetInitialStateを使用する場合の違いとは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Android Studioでパラメータ化されたユニットテストを実行すると、指定されたインクルードに対するテストが見つからないエラーが発生する
-
[解決済み】インストールエラー。インストールエラー:install_failed_older_sdk
-
[解決済み】Androidエミュレータのエラーメッセージ。"PANIC: Missing emulator engine program for 'x86' CPUS." (パニック: エミュレータ・エンジン・プログラムがありません)
-
[解決済み】Android Studio AVD - Emulator: 終了コード 1 でプロセスが終了
-
[解決済み】レンダリングの問題 レンダリング中に発生した例外:com/android/util/PropertiesMap [重複].
-
[解決済み】Android Studio 3.2 - com.android.tools.build:aapt2:3.2.0-4818971 を見つけられませんでした。
-
[解決済み】'dependencies' を '(groovy.lang.Closure)' に適用できない。)
-
[解決済み】Couldn't load memtrack module Logcat Error
-
[解決済み] 複数のデバイスを接続しているときにADB Shellを使用するには?error: more than one device and emulator "で失敗します。
-
[解決済み] ADBエラー:デーモンに接続できない