Как обновить конкретное значение дочернего элемента в базе данных Firebase

Как обновить конкретное значение дочернего элемента в базе данных Firebase

Я хочу обновить последнее сообщение, попробовать несколько методов, но немного запутался, каков точный код для обновления последнего сообщения. Заранее спасибо. Ниже приведен код, который я пробовал:

databaseReference = FirebaseDatabase.getInstance().reference.child("user").child(apiKey)
        databaseReference.orderByChild("api_key").equalTo(loginModel.api_key).addValueEventListener(object : ValueEventListener{
            override fun onCancelled(error: DatabaseError) {

            }

            override fun onDataChange(snapshot: DataSnapshot) {
                if (snapshot.exists()){
                    val map = mutableMapOf<String, String>()
                    map["last_message"] = message
                    map["last_message_key"] = apiKey
                    //databaseReference.child("api_key").child(loginModel.api_key).updateChildren(map.toMap())
                    //databaseReference.updateChildren(map.toMap())
                    databaseReference.child(snapshot.key!!).setValue(chatUser)
                    Utils.showToast(requireContext(), "Exists")
                }else{
                    Utils.showToast(requireContext(), "Not Exists")
                    userReference.setValue(chatUser)
                }
            }
        })

Вы читали эта часть документации? Если да, то чего конкретно вы не понимаете?

samthecodingman 02.04.2021 18:23

Можете ли вы опубликовать несколько методов, которые вы пробовали? В документах есть очень конкретные примеры перезаписи данных в определенных местах.

srinij 02.04.2021 18:37

Если вы уже что-то пробовали и не смогли заставить его работать, отредактируйте свой вопрос, чтобы отобразить минимальный код, который может запустить любой из нас, который воспроизводит то место, в котором вы застряли.

Frank van Puffelen 02.04.2021 18:37

@srinij, пожалуйста, проверьте код.

Rakesh kushwaha 02.04.2021 18:51
0
4
42
3

Ответы 3

Было бы полезно, если бы вы разместили код, а также объяснили результат своего кода, чтобы мы могли лучше понять его. Пример из документации: mDatabase.child("users").child(userId).child("username").setValue(name); Вы можете вызвать в .child вплоть до вашего предпочтительного ребенка и сделать setValue(). Судя по вашему коду, проблема может заключаться в значении snapshot.key!!, которое, похоже, указывает на ваше значение apiKey. Что вам нужно, так это mDatabase.child("user").child("2c3e...").child("-MXH..").updateChildren(). setValue() перезапишет все в этом узле. Вам следует выполнить отладку, чтобы увидеть, какие значения вы видите на каждом этапе.

Чтобы иметь возможность обновлять свойства в базе данных Firebase Realtime при использовании запроса, вы должны вызвать getRef () непосредственно в объекте DataSnapshot, как объясняется в следующих строках кода:

val rootRef = FirebaseDatabase.getInstance().reference
val apiKeyRef = rootRef.child("user").child("apiKey")
val query = apiKeyRef.orderByChild("api_key").equalTo(loginModel.api_key)
val valueEventListener = object : ValueEventListener {
    override fun onDataChange(dataSnapshot: DataSnapshot) {
        if (dataSnapshot.exists()) {
            for (ds in dataSnapshot.children) {
                val map = mutableMapOf<String, String>()
                map["last_message"] = message
                map["last_message_key"] = apiKey
                ds.getRef().updateChildren(map)
            }
        }
    }

    override fun onCancelled(databaseError: DatabaseError) {
        Log.d("TAG", databaseError.getMessage()) //Don't ignore potential errors!
    }
}
query.addListenerForSingleValueEvent(valueEventListener)

Я также рекомендую вам прикрепить полный слушатель ко всем операциям обновления, чтобы всегда знать, если что-то пойдет не так.

Привет, Ракеш! Вы пробовали мое решение выше? Если вы считаете, что мой ответ вам помог, примите его (✔️). Я был бы очень признателен. Спасибо!

Alex Mamo 06.04.2021 21:39

Вместо использования метода set(), я думаю, вам следует использовать метод update(). В этом методе вы передаете объект, а firebase обнаруживает обновленные свойства. Я использую его для своего проекта и отлично работает.

Другие вопросы по теме

После публикации моих приложений в магазине Google Play мои приложения не могут получать данные из хранилища данных для повторного использования представления разбивки на страницы
В моем приложении я пытаюсь получить конкретную информацию о пользователе из базы данных, используя идентификатор пользователя. Я получаю пустые поля, в которых я успешно сохранил ее
Как получить данные из трех коллекций firebase в одну таблицу в react js
Как программно установить местоположение ресурса GCP по умолчанию с помощью fiebase cli или любым другим способом
Пакеты Firebase Messaging не работают после обновления пакета?
Могу ли я использовать ключ where в firestore без сопоставления строки
Firebase Firestore «Отсутствуют или недостаточно разрешений», несмотря на открытые правила безопасности
Столкновение с ошибкой "код-7". Laravel + Firestore
Создание настраиваемой службы push-уведомлений для приложения Android
Отправить уведомление от клиента - Firebase Cloud Messaging - быстро программно