如何更新包含数据库中特定值的子节点

时间:2017-12-09 17:34:58

标签: android json firebase firebase-realtime-database

String userID = selectedCharacter.getUserID();
String charID = selectedCharacter.getCharID();
Character editedCharacter = new Character(userID, charID, name, hitPoints, armorClass, level, experience, gold);

            databaseRef                     
                    .orderByChild("charID")
                    .equalTo(selectedCharacter.getCharID())
                    .addValueEventListener(new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {
                            // Translate the character to a map of its data
                            Map<String,Object> updates = editedCharacter.toMap();
                            // Update ONLY the node with charID = editedCharacter.getCharID()
                            databaseRef.updateChildren(updates);
                        }

                        @Override
                        public void onCancelled(DatabaseError databaseError) {
                            throw databaseError.toException();
                        }
                    });

所以我正在尝试更新我的firebase数据库中的角色统计数据。如你所见:

Application.platform

我正在使用的代码实际上是将更新放在字符的根目录中。我在这做错了什么?我不确定如何使用密钥找到节点,因为我没有将密钥存储在任何地方。

2 个答案:

答案 0 :(得分:0)

而不是databaseRef.updateChildren(updates);

你能试试吗

databaseRef.child(dataSnapshot.getKey()).setValue(updates)

然后看看它是否有效。

答案 1 :(得分:0)

对Firebase数据库执行查询时,可能会有多个结果。因此快照包含这些结果的列表。即使只有一个结果,快照也会包含一个结果的列表。

因此,您的代码需要处理快照是列表的事实。对于Android而言,这意味着您循环遍历snapshot.getChildren()

databaseRef                     
    .orderByChild("charID")
    .equalTo(selectedCharacter.getCharID())
    .addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for (DataSnapshot child: dataSnapshot.getChildren()) {
                // Translate the character to a map of its data
                Map<String,Object> updates = editedCharacter.toMap();
                // Update ONLY the node with charID = editedCharacter.getCharID()
                child.getRef().updateChildren(updates);
            }
        }