Firebase更新了很多孩子的价值

时间:2017-07-28 07:36:19

标签: android firebase firebase-realtime-database

假设我在“post”中有10000个子节点,每个节点都包含子节点“username”。如果在10000个数据中添加了“userA”6000。如何在“post”

中更新每个节点中的“userA”

firebase

4 个答案:

答案 0 :(得分:2)

您需要了解所有用户帖子。

你需要这样的结构:

root
 |
 +-- posts
 |     |
 |     +-- $postId
 |           |
 |           +-- text: $text
 |           |
 |           +-- username: $username
 |
 +-- userPosts
 |     |
 |     +-- $userId
 |           |
 |           +-- $postId: true

使用此结构,您可以检索用户的所有帖子ID并更新帖子。

答案 1 :(得分:1)

Firebase如果是NOSQL架构,则无法对其进行直接查询。您需要在所有节点上应用迭代,并在用户名为" userA"

时更新

答案 2 :(得分:0)

如果您想将文本从 helloA 更改为 hello我是,例如代码如下:

sonar.jdbc.maxActive=20
sonar.jdbc.maxIdle=5

所以你有一个dataSnapshot,每个帖子的用户名都等于userA,你可以迭代它并更改那些帖子

答案 3 :(得分:0)

问题是关于更新字段用户名。 我的建议是为更新值创建一个临时hashMap。所以它只会为所有帖子更新一次。

诀窍是,在更新节点的子节点时,您可以将带有斜杠“/”的“the_key”加上要更新的字段,在本例中为“username”

DatabaseReference postDbRef = FirebaseDatabase.getInstance().getReference("posts");

Map<String, Object> updateValues = new HashMap<String, Object>();
String oldUserName = "userA";
String newUserName = "userA new";

postDbRef.orderByChild("username")
   .equalTo(oldUserName)
   .addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                if (dataSnapshot.exists()){
                    for (DataSnapshot childSnapshot: dataSnapshot.getChildren()) {
                        updateValues.put(childSnapshot.getKey()+"/username", newUsername);
                    }

                    postDbRef.updateChildren(updateValues);
                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
    });
;

为了提高性能,我建议在数据库规则中添加“.indexOn”。像这样:

"posts": {
  ".indexOn": ["username"]
},