当前位置: 首页 > 知识库问答 >
问题:

如何在 MVVM 架构Android中的云火堆实时更新中包含源缓存

昌栋
2023-03-14

在我的应用程序中,我使用的是android MVVM架构,因此为了从云Firestore检索数据,我正在使用图层,因此我创建了另一个类(FirebaseQueryLiveData)以从Firestore获取结果。因此,使用我的代码,我获得了实时更新,但无法添加Firestore的缓存源功能。我想通过添加缓存来启用离线模式。如何添加它。

产品视图型号.java

public class ProductViewModel extends AndroidViewModel {
private FirebaseFirestore db = FirebaseFirestore.getInstance();
private MediatorLiveData<List<ProductModel>> productListLiveData;
private FirebaseQueryLiveData liveData;
 public ProductViewModel(@NonNull Application application) {
        super(application);
    }
public LiveData<List<ProductModel>> getProductList() {
        productListLiveData = new MediatorLiveData<>();
        completeProductList();
        return productListLiveData;
    }
      private void completeProductList() {
     Query query =  db.collection("mainCollection").document("productList")
                .collection("productCollection");
        liveData = new FirebaseQueryLiveData(query);
        productListLiveData.addSource(liveData, new Observer<QuerySnapshot>() {
            @Override
            public void onChanged(QuerySnapshot queryDocumentSnapshots) {
                if (queryDocumentSnapshots!= null){
                    List<ProductModel> productModelList = new ArrayList<>();
                    for (QueryDocumentSnapshot documentSnapshot : queryDocumentSnapshots){
                        ProductModel model = documentSnapshot.toObject(ProductModel.class);
                        productModelList.add(model);                     
                    }productListLiveData.setValue(productModelList);
                }
            }
        });

}

FirebaseQueryLiveData.java

public class FirebaseQueryLiveData extends LiveData<QuerySnapshot> {

    private MyValueEventListener listener = new MyValueEventListener();
    private Query query;
    Source source = Source.CACHE;

    private boolean listenerRemovePending = false;
    private ListenerRegistration registration;
    private Handler handler = new Handler();
    private final Runnable removeListener = new Runnable() {
        @Override
        public void run() {
            registration.remove();
            listenerRemovePending = false;

        }
    };

    public FirebaseQueryLiveData(Query query) {
        this.query = query;
    }

    @Override
    protected void onActive() {
        super.onActive();
        if (listenerRemovePending){
            handler.removeCallbacks(removeListener);
        }else {
          registration=  query.addSnapshotListener(listener);
        }
        listenerRemovePending= false;
    }

    @Override
    protected void onInactive() {
        super.onInactive();
        handler.postDelayed(removeListener, 2000);
        listenerRemovePending=true;
    }

    private class MyValueEventListener implements EventListener<QuerySnapshot> {
        @Override
        public void onEvent(@Nullable QuerySnapshot queryDocumentSnapshots, @Nullable FirebaseFirestoreException e) {
            setValue(queryDocumentSnapshots);
        }
    }
}

共有1个答案

慕朝明
2023-03-14

对于 Android 和 iOS,Cloud Firestore 默认启用离线持久性。这意味着您的应用将在断开连接的短到中段时间内工作。

是的,您可以在DocumentReference.get(Source Source)和Query.get(Source source)方法的帮助下指定源。

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

因此,我们现在可以将参数传递给 DocumentReference查询源,以便我们可以像这样强制从 chache 检索数据:

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
    }
});

在这种情况下,我们强制仅从缓存中检索数据,但是当您说要获取实时更新时,为什么要使用此功能?因此,对于您的用例,我不明白为什么要从缓存中获取数据。

 类似资料:
  • 所以我遵循MVVM架构,在那里我有一个银行交易数据库: 我的Dao类有两个查询: 仓库: 视图模型: 在主片段中,我正在用数据库中的所有事务填充回收视图: 我的问题是:如何从DAO调用函数 要填充相同的recyclerView(当按下某个按钮时)?我不能吃这样的东西 在我的DAO中,因为查询应该在另一个线程上执行(我不允许在主线程上执行),所以我的DAO不能返回事务列表<你能提供帮助吗?

  • 我想实现,让我们说温度单位转换器。我想使用AndroidMVVM和数据绑定来做到这一点,但我不知道如何。我有一个片段,它由三个编辑文本字段组成:摄氏度,华氏度,开尔文。更改其中之一后,其余部分应自动更新。在没有数据绑定的情况下,我将 TextWatcher 设置为每个字段,并在 onTextChanged 中执行所有验证和转换逻辑,并设置其他字段的值。在之前文本更改中,我删除了其他字段的侦听器,并

  • 问题内容: 例如,我有一个名为的文件,其中包含个人信息(身份证,姓名,薪水): 如何编写允许用户输入人的ID并补充薪水的Java代码?最终输出将如下所示: 输入ID:A123 输入补充工资:2000 运行程序后的file.txt: 这是我到目前为止所做的,但没有成功: 我刚接触这些东西。任何帮助将不胜感激。 问题答案: 您必须使用从原始文件逐行读取它的方法。搜索并用新号码替换薪水。将内容写入新的临

  • 所以我的应用程序有一个主窗口显示食谱列表,第二个窗口(从主窗口打开)添加新的食谱到列表(有信息)。两个窗口具有相同的视图模型。经过测试,新的制作方法被成功添加到列表中,但是UI没有更新新的制作方法。我也有一个删除按钮在主窗口为每个食谱和它的工作正常。删除的制作方法将在视图模型和UI中删除。我的代码相当长。我希望它是可读的。下面是我的代码(还有很多其他的UI,所以我只显示相关的代码): 主窗口视图

  • 问题内容: 我正在建立一个维度数据仓库,并学习如何从我的仓库中的源系统中为各种业务流程建模。 我目前正在将数据仓库中源系统中的“出价”(工作出价)建模为事实表,其中包含以下信息: 竞标金额 预计收入 销售员 出价状态(有效,待处理,已拒绝等) 等等。 问题在于出价(或我尝试建模的大多数其他过程)可能会经历各种状态,并且在源系统中的任何给定时刻都会更新其信息。根据Ralph Kimball的说法,只

  • 我正在探索新的Android架构组件,并希望将其实现到一个Android应用程序中。当我在iOS开发中使用MVVM时,我对MVVM非常了解。阅读了Google提供的Android Architecture Components guide:https://developer.Android.com/topic/libraries/Architecture/guide.html 我有几个问题...

  • 问题内容: 我看过几个网站,这些网站向您显示数据库中正在发生的事情的实时更新。一个例子可能是 股票行情实时显示股票价格的网站 显示诸如“其他用户当前正在搜索的内容”之类的数据。 我认为这将涉及某种轮询机制,该机制每隔几秒钟会查询一次数据库并将其呈现在网页上。但是,从性能角度考虑时,这种想法使我感到恐惧。 在我正在处理的应用程序中,我需要显示用户提交的操作的实时状态。用户等待该过程完成。当操作完成时

  • 我在更新BigQuery模式时遇到了一些延迟问题。 我有一个表,它接收流式插入,并且架构在需要时会自动更新。问题在于,架构更新似乎在一段时间内不会生效,并且在该持续时间内进行的插入会删除新列的值。 我从2016年发现了这个答案,它说在更改生效之前可能会有长达5分钟的延迟。 这种情况仍然存在吗?您如何解决这一问题?如果答案是超时,那么在写入新列之前应该等待多长时间?