2016-12-28 58 views
1

我想從Firebase數據庫中刪除Room2節點。我有這樣的數據庫結構:無法從Android中的Firebase中刪除節點

db-24f7f 
| 
- Hotel 
     | 
    -Room1 
     | 
      beds:"2" 
      Chairs: "6" 
    -Room2 
     | 
     beds:"3" 
     Chairs: "8" 

我嘗試作爲

database = FirebaseDatabase.getInstance(); 
myRef = database.getReference(); 
database.getReference("Hotel").orderByChild("Chairs").equalTo("8").addListenerForSingleValueEvent(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
      dataSnapshot.getRef().setValue(null); 
    } 

即刪除整個數據庫。然後我試圖爲

database = FirebaseDatabase.getInstance(); 
myRef = database.getReference(); 
database.getReference("Hotel").orderByChild("Chairs").equalTo("8").addListenerForSingleValueEvent(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       for(DataSnapshot ds:dataSnapshot.getChildren()){ 
        ds.getRef().removeValue(); 
       } 
      } 

,找到這個:

12月12日至28日:31:21.813 22950-22950/PKGName_o E/ViewRootImpl:sendUserActionEvent()MView的== NULL 12月12日至28日:31:21.813 22950-22950/PKGName_o E/ViewRootImpl:sendUserActionEvent()mView == null W/PersistentConnection:pc_0 - 使用未指定的索引。考慮在酒店添加''.indexOn':'Chairs''到您的安全和Firebase數據庫規則以獲得更好的性能

此後,節點不會從Firebase中刪除。爲什麼無法刪除節點?

+0

你的第二個代碼很好,它應該已經工作。 logcat只顯示警告,firebase sdk建議您將該索引選項添加到Firebase數據庫規則中。如果您不添加該規則,您的代碼將起作用。 我已經嘗試使用相同的數據庫和房間2預期刪除您的代碼。 – Wilik

回答

1

在Room節點下添加房間密鑰。

db-24f7f 
| 
- Hotel 
     | 
    -Room1 
     | 
      beds:"2" 
      roomKey: "Room1" 
      Chairs: "6" 
    -Room2 
     | 
     beds:"3" 
     roomKey: "Room2" 
     Chairs: "8" 

現在請參考'酒店'。

DatabaseReference hotelRef = myRef.child("Hotel"); 

如果你只是想刪除室2,然後通過室2的值設置爲null這樣做 -

hotelRef.child("Room2").setValue(null); 

如果你想刪除與8把椅子所有的房間,然後 -

hotelRef.orderByChild("Chairs").equalTo("8").addListenerForSingleValueEvent(new ValueEventListener() { 
       @Override 
       public void onDataChange(DataSnapshot dataSnapshot) { 
        for(DataSnapshot ds:dataSnapshot.getChildren()){ 
         String roomKey = (String) ds.child(roomKey).getValue(); 
         hotelRef.child(roomKey).setValue(null); 
        } 
       }