2017-02-17 122 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();