我有按日期排序的旅行数据(大集合)列表。
现有行为
最初,我将所有行程数据存储到SqlLite Db中。对于添加的每个新数据,我将发送fcm通知以获取可用的新数据,并使用lut仅同步新添加的数据。这样,当cx打开应用程序时,他将始终从我的数据库中读取数据,从而节省了 read 和 network 操作。
我如何在Firestore中实现相同目标?
要考虑的几个问题:
答案 0 :(得分:5)
Firestore get()始终尝试首先从SERVER获取数据,即使我将CACHE添加到查询中,如何仅同步更新的文档?
根据有关enable offline data的官方文档:
对于Android和iOS,默认情况下启用离线持久性。
因此,要使用离线持久性,您无需对代码进行任何更改(“添加”)即可使用和访问Cloud Firestore数据。
还根据有关Query的get()方法的官方文档:
默认情况下,get()尝试通过等待来自服务器的数据来尽可能地提供最新数据,但是它可能会返回缓存的数据,或者如果您处于脱机状态并且无法访问服务器,则会失败。可以通过Source参数来更改此行为。
这是正常的行为。从2018-06-13(16.0.0 SDK)开始,现在可以指定我们要从中获取数据的来源。我们可以借助DocumentReference.get(Source source)和Query.get(Source source)方法来实现这一目标。
如您所见,我们现在可以将参数作为参数传递给DocumentReference
或源Query
,以便我们可以强制从server only
,{{ 1}}或尝试服务器并回退到缓存。
所以现在可以这样:
chache only
在这种情况下,我们强制仅从服务器检索数据。如果要强制仅从缓存中检索数据,则应将其作为参数传递给yourDocRef.get(Source.SERVER).addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
@Override
public void onSuccess(DocumentSnapshot documentSnapshot) {
//Get data from the documentSnapshot object
}
});
方法get()
。更多信息here。
如果只想获取Source.SERVER
,则可以view changes between snapshots。官方文档中的示例为:
updated documents
查看每种特殊情况的switch语句吗?第二种情况将帮助您仅获取更新的数据。
在我的Recyler视图中,我希望按字段日期而不是lut(last-modified-time)排序数据
在这种情况下,您应该创建一个查询,该查询允许您按特定的日期属性对结果进行排序。假设您具有一个如下所示的数据库结构:
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;
}
}
}
});
like这样的查询将帮助您实现这一目标:
Firestore-root
|
--- items (collection)
|
--- itemId (document)
|
--- date: Oct 08, 2018 at 6:16:58 PM UTC+3
|
--- //other properties
This 也是建议的一种向Cloud Firestore数据库添加时间戳的方法。
使用FireStore Snapshot Listener,我无法查询这么大的记录集。
哦,可以。根据{{3}},Firebase可以有效遍历数十亿个项目。该答案适用于Firebase实时数据库,但相同的原理也适用于Cloud Firestore。