私は、日付順出張データ(大きなセット)のリストを持っています。
既存の動作
私はSqlLite DBにすべての出張データを格納します。追加されるすべての新しいデータのために、私はFCM通知を取得するために使用し、私が最後に更新された時間の概念を使用してのみ、新規追加されたデータを同期。CXアプリを開き、これまでこのように、彼はいつもそこで節約、私のDBからデータを読み込みます読み込みおよびネットワーク運用を。
どのように私はFirestoreと同じことを達成できますか?
考慮すべきいくつかの問題:
- Firestore GET()は、いつも私が唯一の更新されたドキュメントを同期することができますどのように、私は私のクエリにCACHEを追加した場合でも、サーバからの最初のデータを取得しようとします
- 私RecylerビューIでデータをフィールド順になりたい日付ないLUT(最終更新時刻)で
- FireStoreスナップショットリスナーで、私はこのような大規模なレコードセットを照会することはできません。
Firestore GET()は、いつも私が唯一の更新されたドキュメントを同期することができますどのように、私は私のクエリにCACHEを追加した場合でも、サーバからの最初のデータを取得しようと?
公式文書によると、オフラインデータを有効にします:
AndroidとiOSの場合は、オフラインの持続性はデフォルトで有効になっています。
だから、オフラインで永続性を使用するには、任意の使用することができるようにするために、あなたのコードを変更してアクセスクラウドFirestoreデータ(「追加」)を作成する必要はありません。
また、クエリのに関する公式文書によるGET()メソッド:
デフォルトでは、可能なサーバからのデータを待っていることにより、最新のデータを提供することができますが、オフラインになっていると、サーバーに到達できない場合には、キャッシュされたデータを返すか、失敗する可能性があります()の試行を取得します。この動作は、経由して変更することができ、ソースパラメータ。
だから、これは正常な動作です。2018年6月13日(16.0.0 SDK)を起動すると、私たちはデータを取得したい、そこからソースを指定できるようになりました。私たちは、の助けを借りてこれを達成することができますDocumentReference.get(ソース元)とQuery.get(出典元)メソッド。
あなたが見ることができるように、我々は今の引数として渡すことができDocumentReference
たりとQuery
、我々はからのデータの取得を強制することができますので、ソースserver only
、chache only
またはサーバーをしようとバックキャッシュに分類されます。
したがって、このような何かが可能になりました。
yourDocRef.get(Source.SERVER).addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
@Override
public void onSuccess(DocumentSnapshot documentSnapshot) {
//Get data from the documentSnapshot object
}
});
このケースでは、我々は唯一のサーバーから取得するデータを強制します。あなただけのキャッシュから取得されるデータを強制したい場合は、引数として渡す必要がありget()
、方法Source.SERVER
。その他の情報ここに。
あなただけ取得したい場合はupdated documents
、次のことができ、スナップショット間の変更を表示します。公式ドキュメントの例は次のようになります。
db.collection("cities")
.whereEqualTo("state", "CA")
.addSnapshotListener(new EventListener<QuerySnapshot>() {
@Override
public void onEvent(@Nullable QuerySnapshot snapshots,
@Nullable FirebaseFirestoreException e) {
if (e != null) {
Log.w(TAG, "listen:error", e);
return;
}
for (DocumentChange dc : snapshots.getDocumentChanges()) {
switch (dc.getType()) {
case ADDED:
Log.d(TAG, "New city: " + dc.getDocument().getData());
break;
case MODIFIED:
Log.d(TAG, "Modified city: " + dc.getDocument().getData());
break;
case REMOVED:
Log.d(TAG, "Removed city: " + dc.getDocument().getData());
break;
}
}
}
});
すべての特定のケースのためにswitch文を参照してください?後者の場合は、あなたが更新されたデータのみを取得するのに役立ちます。
私RecylerビューIのデータはないLUT(最終更新時刻)によって、フィールド日付順になりたいです
この場合、あなたは、特定の日付プロパティで結果を注文できるようにクエリを作成する必要があります。あなたは、データベースの構造を持っていると仮定すると、次のようになります。
Firestore-root
|
--- items (collection)
|
--- itemId (document)
|
--- date: Oct 08, 2018 at 6:16:58 PM UTC+3
|
--- //other properties
あなたはこれを達成するのに役立ちますようなクエリ:
FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
CollectionRefference itemsRef = rootRef.collection("items");
Query query = itemsRef.orderBy("date", Query.Direction.ASCENDING);
これはまた、あなたがクラウドFirestoreデータベースにタイムスタンプを追加することができた上で推奨される方法です。
FireStoreスナップショットリスナーで、私はこのような大規模なレコードセットを照会することはできません。
ああ、はい、できます。このよる答えを数十億の項目を通じて、Firebaseができる効果的にループ。この回答はFirebaseリアルタイムデータベースのためであるが、同じ原理がクラウドFirestoreに適用されます。