チャットでの会話に次のすべてのデータを使用すると、いつでもオフラインで利用できるようになると思いました。どういうわけかではなく、すべてのノードがサーバーからロードされます。
_FirebaseDatabase.getInstance().setPersistenceEnabled(true);
_
その後、DOCSによると:
永続化の動作:永続化を有効にすると、オンライン中に同期するデータはディスクに永続化され、アプリを再起動してもオフラインで利用可能になります。これは、キャッシュに保存されたローカルデータを使用してオンラインのようにアプリが機能することを意味します。
setPersistenceEnabled(true);
のときにデータが既にオフラインで利用できる場合、なぜkeepSynced(true)
が必要なのですか?
_DatabaseReference r = FirebaseDatabase.getInstance().getReference("chat/roomid");
r.keepSynced(true);
_
アプリのFirebase Databaseクライアントは、データベース内のデータを2つの場所に保存できます。メモリ内および/またはディスク上です。
ロケーションの同期を維持すると、クライアントは基本的に空のリスナーをそのロケーションにアタッチします。そのため、アプリのデータは、サーバー上のデータベースにあるものと常に最新になります(ネットワーク接続がある限り)。永続性を有効にしていない場合、データはメモリ内で最新の状態に維持されます。永続性を有効にしている場合、永続性はディスク上でも最新に保たれます。
パーシステンスでkeepSyncedを使用するのが最も一般的ですが、パーシステンスなしのユースケースもあります。
たとえば、マスター/詳細アプリを使用している場合、アイテム名のリストから各アイテムの詳細に頻繁に移動します。その場合、アイテム名のリストを同期しておくと、ユーザーが詳細画面から戻ったときにそのデータをリロードする必要がなくなります。
もちろん、単にデータのリスナーを保持することもできます。これは基本的に、keepSyncedが舞台裏で行うことです。
setPersistanceEnabled(true)オフラインで使用するためにデータを保存します。
keepsynced(true)デフォルトでは、Firebaseはキャッシュに10 MBのデータを保持します。さらに大きくなると、新しいデータに置き換えられます。
デフォルトでは、Firebaseクライアントはアプリケーションの実行中にデータをメモリに保持しますが、再起動したときは保持しません。この値をtrueに設定すると、データはデバイス(ディスク)ストレージに保持され、アプリの再起動時に再び利用可能になります(その時点でネットワーク接続がない場合でも)。このメソッドは、最初のFirebase参照を作成する前に呼び出す必要があり、アプリケーションごとに1回だけ呼び出す必要があることに注意してください。アプリでFirebase Authenticationを使用している場合、永続性が有効になっていない場合でも、クライアントは再起動後もユーザーの認証トークンを自動的に永続化します。ただし、オフライン中に認証トークンの有効期限が切れ、永続性を有効にした場合、クライアントが書き込み操作を一時停止し、正常に再認証(または明示的にunauthを呼び出す)して、書き込みが認証されずに送信され、セキュリティルールのために失敗しないようにします。
データはディスクに保持され、アプリrestartのときに利用可能になることに注意してください。 アクティビティのライフサイクル を見ると、他のアクティビティに変更するとアクティビティが停止することがわかります。そのため、アプリがまだ開いていて、ユーザーが他のアクティビティに移動している限り、データは保持されます。
ただし、アプリを強制終了してデータを保持することについては何も言わないでください。それがkeepSynced()
が必要な理由です:
場所でkeepSynced(true)を呼び出すと、その場所のリスナーがアタッチされていない場合でも、その場所のデータが自動的にダウンロードされ、同期されます。また、場所の同期が維持されている間は、永続ディスクキャッシュから削除されません。
「場所の同期が保たれている間、永続ディスクキャッシュから削除されない」という注意を払ってください。つまり、keepSynced(true)
を使用しないと、アプリの起動時にデータがフラッシュされる可能性があります。殺された/閉じられた。
そのため、アプリが強制終了された後もデータを保持し続けるには、FirebaseDatabase.getInstance().setPersistenceEnabled(true);
とkeepSynced(true)
の両方を使用する必要があります。