Firebase:以任何方式定义“任何”节点?

时间:2019-04-22 14:01:25

标签: android firebase firebase-realtime-database kotlin

好的,这就是我的Fireabse数据库的样子:

enter image description here 现在,我需要为每个用户更新“关于”节点。没有用户节点,这就是我要做的:

    val mAllUserDatabase : DatabaseReference  = FirebaseDatabase.getInstance().reference.child("Users"))

    val childUpdates = HashMap<String, Any>()
    childUpdates["/about"] = "new value"

    mAllUserDatabase.updateChildren(childUpdates)

问题是,我需要定义用户的节点(不是吗?)。但是由于用户节点都具有不同的名称,因此我需要类似“任何节点”或“所有节点”的名称。

    childUpdates["/any/about"] = "new value"
快照的

getChildren()

解决此问题的最佳方法是什么?我是否必须使用addListenerForSingleValueEvent来读取所有节点的名称,然后将mAllUserDatabase上的名称与.updateChildren(childUpdates)一起使用?那不是最好的方法。

2 个答案:

答案 0 :(得分:1)

要将值写入Firebase实时数据库中的节点,您需要知道该节点的确切路径。 Firebase没有SQL更新查询的概念。

因此,在您的情况下,您需要首先读取要更新的节点,然后遍历它们,然后一个一个地或使用一条大型的多位置更新语句来更新它们。

答案 1 :(得分:1)

要在所有用户对象中更新您的about属性,请使用以下代码行:

val rootRef = FirebaseDatabase.getInstance().reference
val usersRef = rootRef.child("Users")
val valueEventListener = object : ValueEventListener {
    override fun onDataChange(dataSnapshot: DataSnapshot) {
        for (ds in dataSnapshot.children) {
            val childUpdates = HashMap<String, Any>()
            childUpdates["about"] = "yourNewAboutValue"
            ds.ref.updateChildren(childUpdates)
        }
    }

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