android - 手动设置 Firebase Firestore 缓存
问题描述
我正在为我的问题寻找解决方案,我有一个聊天应用程序,它将所有用户的通信显示为 Recyclerview 一个侦听器,为了在用户发送消息时改善用户体验,我使用当前列表手动更新 Recyclerview 加上带有“上传指示”的新消息然后当消息实际上传到 Firebase 时,侦听器会覆盖我使用的本地列表并将最后一条消息更新为“已上传”,问题是如果我重建活动,侦听器会自动将 Recyclerview 的列表更新为缓存的那个因此用户在它到达服务器之前不能再看到他的“上传”消息。正在考虑是否可以手动设置监听器' s 缓存到本地列表而不等待它上传?如果没有,也许有更好的解决方案我没有想过?(我与许多不同的用户有很多不同的聊天,所以我需要能够获取每个聊天频道自己的唯一列表)
解决方案
有一个选项可以强制查询仅从缓存中检索数据。如果这是您需要的,您可以借助DocumentReference.get(Source source)和Query.get(Source source)方法来实现。
默认情况下,
get()
通过等待来自服务器的数据,尽可能尝试提供最新数据,但如果您处于脱机状态且无法访问服务器,它可能会返回缓存数据或失败。可以通过 Source 参数更改此行为。
因此,您可以将作为参数传递给DocumentReference
或源,Query
以便我们可以强制从或 尝试服务器检索数据并回退到缓存。server only
chache only
所以像这样的东西可以解决问题:
FirebaseFirestore db = FirebaseFirestore.getInstance();
DocumentReference docIdRef = db.collection("tests").document("fOpCiqmUjAzjnZimjd5c");
docIdRef.get(Source.CACHE).addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
@Override
public void onSuccess(DocumentSnapshot documentSnapshot) {
//Get data from the documentSnapshot object
}
});
在这种情况下,我们强制仅从缓存中检索数据。如果要强制仅从服务器检索数据,则应get()
将Source.SERVER
. 更多信息在这里。
推荐阅读
- android - AWS Api Gateway 生成的 Android SDK 在响应代码不是 200 时崩溃
- audio - ffmpeg生成的mp4没有声音
- jquery - JQuery Accordion beforeActivate 不起作用
- c# - 如何使用 c# 在 SCORM 中创建 imsmanifest.xml 文件
- python - Linux中的Python下载文件-如何不替换同名文件?
- reactjs - 无法获取“x”,因为未定义中缺少属性“x”
- mysql - 用于获取日历中确实有事件的用户的 SQL 查询
- python - 用漂亮的汤刮网页 4. 删除基于类的 tr 元素。Python
- c - 将 char* 直接传递给 printf
- mongodb - 使用 MongoDB 检查 Golang 中的对象数组中的重复项