Firestore更新2个不同的文档

时间:2019-02-20 20:01:40

标签: java android firebase google-cloud-firestore

我在我的应用中使用Cloud Firestore,并且有2个集合CustomersProperties。我有一个活动,用户可以更新包含在客户文档名称地址等中的数据。下面显示的代码可以正常工作。

db.collection("Customers").document(customer.getCustomerId())
                .update(
                        "name", c.getName(),
                        "email", c.getEmail(),
                        "phoneNo", c.getPhoneNo(),
                        "address", c.getAddress(),
                        "creatorId", c.getCreatorId()
                )
                .addOnCompleteListener(new OnCompleteListener<Void>() {

我在属性文档中保存了客户的文档引用,因此我可以引用哪个客户拥有哪个属性。使用此引用,我想搜索包含该引用的属性,并在名称字段已更改的情况下更新它。我尝试在onComplete检查上面的代码之后将代码添加到我的方法中,但是它不会每次仅几次尝试就更新名称字段。

FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
        CollectionReference propRef = rootRef.collection("Properties");
        propRef.whereEqualTo("customerId", customerId).get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
            @Override
            public void onComplete(@NonNull Task<QuerySnapshot> task) {
                if (task.isSuccessful()) {
                    for (QueryDocumentSnapshot document : Objects.requireNonNull(task.getResult())) {
                        Map<Object, String> map = new HashMap<>();
                        map.put("customer", customerName);
                        propRef.document(document.getId()).set(map, SetOptions.merge()).addOnCompleteListener(new OnCompleteListener<Void>() {
                            @Override
                            public void onComplete(@NonNull Task<Void> task) {
                                if (task.isSuccessful()) {

有没有办法实现我想要做的事情? 我确实认为我可以使用批处理来实现,但是从我阅读的内容来看,这不允许搜索。

@AlexMamo

这是我的“客户”收藏集中的文档

document from my Customers collection

这是我的媒体资源集合中的链接文档

a linked document from my Properties collection

客户结构

Customers Structure

财产结构

Properties Structure

2 个答案:

答案 0 :(得分:1)

根据您的评论,要解决您的问题,请使用以下代码行:

FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
CollectionReference propertiesRef = rootRef.collection("Properties");
CollectionReference customersRef = rootRef.collection("Customers");
customersRef.whereEqualTo("customerId", customerId).get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
    @Override
    public void onComplete(@NonNull Task<QuerySnapshot> task) {
        if (task.isSuccessful()) {
            for (QueryDocumentSnapshot document : task.getResult()) {
                String customerName = document.getString("name");
                propertiesRef.whereEqualTo("customerId", customerId).get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                    @Override
                    public void onComplete(@NonNull Task<QuerySnapshot> task) {
                        if (task.isSuccessful()) {
                            for (QueryDocumentSnapshot doc : task.getResult()) {
                                propertiesRef.document(doc.getId()).update("customer", customerName);       
                            }
                        }
                    }
                });
            }
        }
    }
});

看到您应该使用不同的CollectionReference对象propertiesRefcustomersRef,而您使用的是单个对象。

答案 1 :(得分:0)

您需要从firestore OnDataChange实现接口,并接收绑定到视图的变量的新值。

在这种情况下,当您修改或更新Firestore中的值时,更改将触发此界面,您可以分配新更改。

ValueEventListener myListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        // Get Post object and use the values to update the UI
        Customer customer = dataSnapshot.getValue(Customer.class);
        // ...
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        // Getting Post failed, log a message
        Log.w(TAG, "loadPost:onCancelled", databaseError.toException());
        // ...
    }
};
rootRef.addValueEventListener(myListener);

希望它对您有用。

https://firebase.google.com/docs/database/android/read-and-write?authuser=0