web-dev-qa-db-ja.com

Firestoreオフラインキャッシュ

Android数週間オフラインで動作する必要がありますが、オンラインになるとすぐにリモートDBと同期できるアプリケーションを作成しています。

私の質問は、Firestoreがこれに適したオプションになれるかどうかです。 Firestoreはオフラインキャッシュをどのくらい保持しますか?

17
Balazs Fabian

Firestoreは、このような非接続/オフラインでの使用のためにデータを保持するように構成できます。この機能を有効にするこのサンプルを含むドキュメントの オフライン永続性を有効にする セクションを読むことをお勧めします。

FirebaseFirestoreSettings settings = new FirebaseFirestoreSettings.Builder()
        .setPersistenceEnabled(true)
        .build();
db.setFirestoreSettings(settings);

この永続性は、実際にはAndroidおよびiOSでデフォルトで有効になっているため、上記の呼び出しは不要です。

Androidデータベースとやり取りするコードは、接続していてもいなくても同じです。SDKは同じように動作するためです。データがキャッシュから来ているかどうかを検出したい場合(古くなっている可能性があります)、ドキュメントのセクション Listen to offline data を読んでください。

キャッシュ内のデータは、一定の時間が経過しても期限切れになりません。キャッシュからデータが削除されるのは、次の2つの理由のみです。

  1. データはサーバーから削除されました。その場合、クライアントはディスクキャッシュから削除します。
  2. クライアントは、最新のデータ用のスペースを確保するためにディスクキャッシュをパージする必要があります。
7

Cloud Firestoreでデータをリッスンすると、キャッシュされたデータのスナップショットがすぐに取得され、アプリがオンラインで接続できるようになったときに更新されます。

final DocumentReference docRef = db.collection("cities").document("SF");
docRef.addSnapshotListener(new EventListener<DocumentSnapshot>() {
    @Override
    public void onEvent(@Nullable DocumentSnapshot snapshot,
                        @Nullable FirebaseFirestoreException e) {
        if (e != null) {
            Log.w(TAG, "Listen failed.", e);
            return;
        }


        // Determine if the data came from the server or from cache
        String source = snapshot != null && snapshot.getMetadata().hasPendingWrites()
                ? "Local" : "Server";


        // Read the data
        if (snapshot != null && snapshot.exists()) {
            Log.d(TAG, source + " data: " + snapshot.getData());
        } else {
            Log.d(TAG, source + " data: null");
        }
    }
});

永続性はデフォルトで有効になっているため、この動作には設定は必要ありません。

1
Sam Stern

次の回答は、次のリンクの公式ガイドに従います。

キャッシュサイズの処理

FirebaseFirestoreSettings settings = new FirebaseFirestoreSettings.Builder()
    .setCacheSizeBytes(FirebaseFirestoreSettings.CACHE_SIZE_UNLIMITED)
    .build();
db.setFirestoreSettings(settings);

上記のコードには、キャッシュがクリアされないようにするsetCacheSize()のフラグが設定されています。同じサイズを指定することもできます。デフォルトでこれを設定しない場合、サイズは100MBです。

ガイドによると、クエリするデータがキャッシュまたはファイアーストアのどちらから来たかを確認する方法があります。また、デバイスがオンラインに戻った瞬間に、Firestoreはキャッシュを更新し、データの同期を維持します。

あなたの質問に答えるために、あなたは数週間オフラインデータを操作しなければならないので、データを取得するたびにjson/xml形式で保存することをお勧めします。パフォーマンスの面で。

私はあなたがいくつかのことをクリアするのを手伝ってくれることを願っています.

0
Harsh Patalia