Firestore обновляет 2 разных документа - PullRequest
0 голосов
/ 20 февраля 2019

Я использую Cloud Firestore в своем приложении и имею 2 коллекции Customers и Properties.У меня есть действие, при котором пользователь может обновить данные, содержащиеся в адресе имени документа клиента и т. Д. Этот код, показанный ниже, работает нормально.

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 голосов
/ 21 февраля 2019

Согласно вашим комментариям, чтобы решить вашу проблему, пожалуйста, используйте следующие строки кода:

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 объекты, propertiesRef и customersRef, выиспользуете один.

0 голосов
/ 20 февраля 2019

вам нужно реализовать интерфейс из firestore OnDataChange и получать новые значения ваших переменных, привязанных к вашим представлениям.

в том случае, когда вы изменяете или обновляете значение в вашем хранилище, изменение вызывает этот интерфейс иВы можете назначить новое изменение.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...