如何解决如何将子集合中的所有文档获取到Firebase Firestore中的RecyclerView
在我的Firestore数据库中,我有一个带有多个文档的“类别”集合,而这些文档又具有带有相应文档的“产品”子集合。
我正在尝试获取所有子集合中的所有文档,并填充到Recylerview中,但是我失败了。
这是我的代码;
private void populateAllProducts() {
Log.d(TAG,"populateAllProducts called: ");
database
.collection(Globals.CATEGORIES)
.get()
.addOnCompleteListener(task -> {
if (task.isSuccessful()) {
for (QueryDocumentSnapshot document : Objects.requireNonNull(task.getResult())) {
Category category = document.toObject(Category.class);
Log.d(TAG,"Category: " + category.getName());
database
.collection(Globals.CATEGORIES)
.document(category.getUuid())
.collection(Globals.PRODUCTS)
.get()
.addOnCompleteListener(task1 -> {
if (task.isSuccessful()) {
for (QueryDocumentSnapshot snapshot : Objects.requireNonNull(task1.getResult())) {
Product product = snapshot.toObject(Product.class);
Log.d(TAG,"All products: " + product.getName());
}
}
})
.addOnFailureListener(e -> Log.e(TAG,"Error: ",e));
}
}
})
.addOnFailureListener(e -> {
vars.verityApp.crashlytics.log("Error while fetching categories");
Log.e(TAG,"Error occured: ",e);
vars.verityApp.crashlytics.recordException(e);
});
}
但我收到此致命异常;
2020-08-11 16:27:16.358 26161-26161/com.verityfoods E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.verityfoods,PID: 26161
java.lang.NullPointerException: Provided document path must not be null.
at com.google.firebase.firestore.util.Preconditions.checkNotNull(Preconditions.java:147)
at com.google.firebase.firestore.CollectionReference.document(CollectionReference.java:103)
at com.verityfoods.ui.bottomviews.shop.ShopFragment.lambda$populateCategories$2$ShopFragment(ShopFragment.java:87)
at com.verityfoods.ui.bottomviews.shop.-$$Lambda$ShopFragment$dIuQdpUfodkE_zdMSo4L2Rr4DL0.onComplete(Unknown Source:2)
at com.google.android.gms.tasks.zzj.run(Unknown Source:4)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
感谢您的帮助!
解决方法
您遇到以下错误:
java.lang.NullPointerException:提供的文档路径不能为null。
因为您要在参考中传递一个null
值。 category.getUuid()
最有可能返回null
,因此出现该错误。看到您的getUuid()
吸气剂,我可以猜得出该属性的名称在数据库中不是uuid
,所以这很可能是原因。
我正在尝试获取所有子集合中的所有文档,并填充到Recylerview中
要获取所有products
子集合中的所有数据,应使用Firestore collection group query而不是常规的CollectionReference
对象。在代码中,此查询应如下所示:
db.collectionGroup("products").get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
@Override
public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
//Iterate to get the products out of the queryDocumentSnapshots object
}
});
,
您正在检查第一项任务是否在第二项任务内完成。
private void populateAllProducts() {
Log.d(TAG,"populateAllProducts called: ");
database
.collection(Globals.CATEGORIES)
.get()
.addOnCompleteListener(task -> {
if (task.isSuccessful()) {
for (QueryDocumentSnapshot document : Objects.requireNonNull(task.getResult())) {
Category category = document.toObject(Category.class);
Log.d(TAG,"Category: " + category.getName());
database
.collection(Globals.CATEGORIES)
.document(category.getUuid())
.collection(Globals.PRODUCTS)
.get()
.addOnCompleteListener(task1 -> {
if (task.isSuccessful()) { //Here should be task1,not task
for (QueryDocumentSnapshot snapshot : Objects.requireNonNull(task1.getResult())) {
Product product = snapshot.toObject(Product.class);
Log.d(TAG,"All products: " + product.getName());
}
}
})
.addOnFailureListener(e -> Log.e(TAG,"Error: ",e));
}
}
})
.addOnFailureListener(e -> {
vars.verityApp.crashlytics.log("Error while fetching categories");
Log.e(TAG,"Error occured: ",e);
vars.verityApp.crashlytics.recordException(e);
});
}
也许当代码到达时task1还没有完成,并且因为任务实际上已经完成,所以无论如何都会触发
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。