在我的应用程序中,我使用的是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);
}
}
}
对于 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分钟的延迟。 这种情况仍然存在吗?您如何解决这一问题?如果答案是超时,那么在写入新列之前应该等待多长时间?