2017-07-28 68 views
0

假设我在“post”中有10000个孩子,每个节点都包含孩子的“用户名”。如果“userA”在10000个数据中添加6000。我怎么能在每个节点更新“用户A”的“后”Firebase更新了很多孩子的价值

firebase

+0

你的结构你不能这样做。 –

+0

是否要将用户名从“userA”更改为另一个用户名? – faruk

+0

谢谢@ J.Doe您可以为此提供示例结构吗? – LIPONEF

回答

1

火力地堡如果NOSQL模式,你不能把它应用直接查询。您需要对所有节点应用迭代,并在用户名为“userA”时更新。

+0

Thanks @Usman您能否举一些例子来说明目的? – LIPONEF

+0

@LIPONEF示例代码在下面的一些答案中发布,您可以根据自己的需要修改它们。 –

2

您需要知道所有用户帖子。

你需要这样的结构:

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

采用这种结构可以检索的所有帖子的ID为用户和更新帖子。

+0

谢谢皮皮克斯,如果我把UID而不是用户名。当我查询每个帖子时,我得到的UID从另一个节点查询用户名(例如root-> users-> uid-> username =“userA”)。比较你的给定结构哪一个更好,因为有人告诉我,我给出的例子可能会浪费你的Firebase流量成本。 – LIPONEF

+0

你不必改变你的帖子结构只是添加userPosts或做像'postsRef.orderByChild(“用户名”)。equalsTo(“userA”)'像'在@jorge回答 – Pipiks

+0

@Pipiks在请求数据,你应该把userId也..我叫它在nosql中的定向关系 – faruk

0

如果你想从helloA更改文本你好我是一个,例如,代码是这样的:

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

    postReference.orderByChild("username").equalsTo("userA") 
      .addListenerForSingleValueEvent(new ValueEventListener() { 
       @Override 
       public void onDataChange(DataSnapshot dataSnapshot) { 
        if (dataSnapshot.exists()) 
         for (DataSnapshot data : dataSnapshot.getChildren()) { 
          data.getRef().child("text").setValue("hello I'm A"); 

所以,你有一个dataSnapshot与每一个岗位与用户名等于用户A你可以迭代它并更改这些帖子

0

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

诀窍是,更新节点的孩子时,你可以把“the_key”用斜杠“/”加上你要更新,在这种情况下,该领域“用户名”

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"] 
},