【问题标题】:Unable to delete a node from Firebase in Android无法从 Android 的 Firebase 中删除节点
【发布时间】:2016-12-28 16:07:12
【问题描述】:

我想从 Firebase 数据库中删除 Room2 节点。我有这个数据库结构:

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-28 12:31:21.813 22950-22950/PKGName_o E/ViewRootImpl: sendUserActionEvent() mView == null 12-28 12:31:21.813 22950-22950/PKGName_o E/ViewRootImpl: sendUserActionEvent() mView == null W/PersistentConnection: pc_0 - 使用未指定的索引。考虑在您的安全和 Firebase 数据库规则中添加 '".indexOn": "Chairs"' 以获得更好的性能

此后,该节点不会从 Firebase 中删除。为什么无法删除节点?

【问题讨论】:

  • 你的第二个代码很好,它应该已经可以工作了。并且 logcat 只显示警告,firebase sdk 建议您将该索引选项添加到 Firebase 数据库规则。如果您不添加该规则,您的代码将起作用。我已经使用相同的数据库尝试了您的代码,并且按预期删除了 Room2。

标签: android firebase firebase-realtime-database


【解决方案1】:

在房间节点下添加房间键。

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

现在参考“酒店”。

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

如果您只想删除 Room2,则将 Room2 的值设置为 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);
                    }
                }

【讨论】:

    猜你喜欢
    • 2019-01-21
    • 2020-06-15
    • 1970-01-01
    • 2016-07-11
    • 1970-01-01
    • 2020-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多