首页 > 解决方案 > 手动设置 Firebase Firestore 缓存

问题描述

我正在为我的问题寻找解决方案,我有一个聊天应用程序,它将所有用户的通信显示为 Recyclerview 一个侦听器,为了在用户发送消息时改善用户体验,我使用当前列表手动更新 Recyclerview 加上带有“上传指示”的新消息然后当消息实际上传到 Firebase 时,侦听器会覆盖我使用的本地列表并将最后一条消息更新为“已上传”,问题是如果我重建活动,侦听器会自动将 Recyclerview 的列表更新为缓存的那个因此用户在它到达服务器之前不能再看到他的“上传”消息。正在考虑是否可以手动设置监听器' s 缓存到本地列表而不等待它上传?如果没有,也许有更好的解决方案我没有想过?(我与许多不同的用户有很多不同的聊天,所以我需要能够获取每个聊天频道自己的唯一列表)

仅上传本地和未缓存的消息

并上传消息被听众覆盖

标签: androidkotlincachinggoogle-cloud-firestorelistener

解决方案


有一个选项可以强制查询仅从缓存中检索数据。如果这是您需要的,您可以借助DocumentReference.get(Source source)Query.get(Source source)方法来实现。

默认情况下,get()通过等待来自服务器的数据,尽可能尝试提供最新数据,但如果您处于脱机状态且无法访问服务器,它可能会返回缓存数据或失败。可以通过 Source 参数更改此行为。

因此,您可以将作为参数传递给DocumentReference或源,Query以便我们可以强制从或 尝试服务器检索数据并回退到缓存。server onlychache 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. 更多信息在这里


推荐阅读