首页 > 解决方案 > 如何将 RecyclerView 中显示的数据与 Firebase 中的文档相关联

问题描述

我有以下情况,即:

我从数据库中获取文档并将它们转换为对象:

代码:

private void getProductsFromDatabaseBreakfast() {

        breakfastProducts.clear();

        firebaseFirestore.collection("Users").document(currentUserUID)
                .collection("Types of Meals").document("Breakfast")
                .collection("Date of Breakfast").document(date)
                .collection("List of Products")
                .get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
            @Override
            public void onComplete(@NonNull Task<QuerySnapshot> task) {

                if(task.isSuccessful()) {

                    for(DocumentSnapshot documentSnapshot: task.getResult().getDocuments()) {

                        Log.i("id", documentSnapshot.getId());

                        breakfastProducts.add(documentSnapshot.toObject(Product.class));
                    }
                }

                if(getFragmentRefreshAdapter() != null) {

                    getFragmentRefreshAdapter().onRefresh();
                }
            }
        });
    }

结构:

数据库

然后我在 RecyclerView 中展示产品:

在此处输入图像描述

谈到优点,我希望用户能够改变产品的细节,准确地说它的重量,这将自动改变其他值(卡路里、蛋白质等)。

因此,在单击给定项目 RecyclerView 后,我会转到用户可以对产品进行更改的活动。如何将用户选择的给定产品与 CloudFirestore 中的相应产品相关联?这种变化也将发生在文件中。

我正在考虑增加产品 ID,然后我可以将产品与 ReyclerView 中的产品位置相关联,但我读到这不是很好的做法,或者还有其他方法吗?

标签: javaandroidfirebasegoogle-cloud-firestore

解决方案


如果用户单击一个项目,则将名称发送到另一个活动,然后进行查询:

CollectionReference ref = firebaseFirestore.collection("Users").document(currentUserUID)
                .collection("Types of Meals").document("Breakfast")
                .collection("Date of Breakfast").document(date)
                .collection("List of Products");

ref.whereEqualTo("name", name).get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
            @Override
            public void onComplete(@NonNull Task<QuerySnapshot> task) {
                if(task.isSuccessful()) {
                    for(DocumentSnapshot documentSnapshot: task.getResult().getDocuments()) {
                      Map<String, Object> data = new HashMap<>();
                        data.put("weight", 200);
                        ref.document(documentSnapshot.getId()).set(data, SetOptions.merge());
                    }
                }
            }
        });

使用查询whereEqualTo查询将返回所有names名称Chicken breast meat,然后在任务成功后使用用户输入的数据更新文档。

https://firebase.google.com/docs/firestore/query-data/queries

https://firebase.google.com/docs/firestore/manage-data/add-data#set_a_document


推荐阅读