2017-02-17 64 views
0

我遵循指导here从我的Firebase数据库中删除值。这是我的数据结构。从Android Firebase删除价值删除整个节点

|---users 
    |----KJSXd4ScEmJ6N4UFc5k 
      |---bookmarks 
       |---KdCyKdQkDg34ny6_H-C 
        |---id:"12d5j2fa-0f70-41c3-b4g4-4d66bdcef976" 
       |---KdCyKdQkDg34ny6_H-M 
        |---id:"fa95b1fa-b537-4d98-a0e7-a92ffea7b6a4" 

这是我正在使用的代码。

FirebaseDatabase.getInstance().getReference().child(MyConstants.FIREBASE_USERS_NODE).child(FirebaseAuth.getInstance().getCurrentUser().getUid()) 
       .child(MyConstants.FIREBASE_BOOKMARKS_NODE).orderByChild("id").equalTo(uuid).addListenerForSingleValueEvent(
       new ValueEventListener() { 
        @Override 
        public void onDataChange(DataSnapshot dataSnapshot) { 
         dataSnapshot.getRef().removeValue(); 
        } 

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

发生了什么事情是整个/书签节点在这个单一的调用中被删除,而不是仅仅是对想要的书签的引用。我可以如何实现删除单个要删除的书签而不是整个节点?

回答

1

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

所以在你的情况下,快照不是项目,但它是查询的总结果。因此它的getRef()返回您在其上触发查询的位置。

解决的办法是遍历所有的结果并单独删除每个:

public void onDataChange(DataSnapshot dataSnapshot) { 
    for (DataSnapshot child: dataSnapshot.getChildren()) { 
     child.getRef().removeValue(); 
    } 
} 
+0

关于其他后续问题。如果您可以选择添加.orderBy()和.equalTo(),但结果并不真正返回唯一的结果,那么使用它们有什么意义?数据集中只有一个书签的uuid,但查询返回整个数据集? 这似乎是答案,但我一直在寻找Firebase内的某些东西,这些东西可以让我更好地查询,而不必只是返回整个数据集,然后循环解析结果。 – Landen

+0

值不必是唯一的,因此查询可以匹配多个结果。在你的具体情况下只有一个结果的事实不会改变返回类型(在大多数类型语言中这是不可能的)。 –

0

你为什么要监听SingleValueEvent为节点,只要尝试下面的代码。

FirebaseDatabase.getInstance().getReference().child(MyConstants.FIREBASE_USERS_NODE).child(FirebaseAuth.getInstance().getCurrentUser().getUid()).child(MyConstants.FIREBASE_BOOKMARKS_NODE).child(uuid).removeValue();