Я хочу обновить последнее сообщение, попробовать несколько методов, но немного запутался, каков точный код для обновления последнего сообщения. Заранее спасибо. Ниже приведен код, который я пробовал:
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)
}
}
})
Можете ли вы опубликовать несколько методов, которые вы пробовали? В документах есть очень конкретные примеры перезаписи данных в определенных местах.
Если вы уже что-то пробовали и не смогли заставить его работать, отредактируйте свой вопрос, чтобы отобразить минимальный код, который может запустить любой из нас, который воспроизводит то место, в котором вы застряли.
@srinij, пожалуйста, проверьте код.
Было бы полезно, если бы вы разместили код, а также объяснили результат своего кода, чтобы мы могли лучше понять его.
Пример из документации: 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)
Я также рекомендую вам прикрепить полный слушатель ко всем операциям обновления, чтобы всегда знать, если что-то пойдет не так.
Привет, Ракеш! Вы пробовали мое решение выше? Если вы считаете, что мой ответ вам помог, примите его (✔️). Я был бы очень признателен. Спасибо!
Вместо использования метода set(), я думаю, вам следует использовать метод update(). В этом методе вы передаете объект, а firebase обнаруживает обновленные свойства. Я использую его для своего проекта и отлично работает.
Вы читали эта часть документации? Если да, то чего конкретно вы не понимаете?