无法从firebase中删除一个孩子,即使我可以检索它

时间:2017-04-30 17:32:29

标签: android firebase firebase-realtime-database

我构建了一个与firebase db交互的应用程序。结构如下。

game
 question
 -KiwYrNcX6B-VSLV8OmQ
   titleofquestion
    a: 
    "test"
    b: 
    "test"
    c: 
    "test"

现在,为了得到我的问题对象,我成功完成了以下操作。

 databaseReference = FirebaseDatabase.getInstance().getReference().child("question");
        databaseReference.addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
                    Question q = postSnapshot.getValue(Question.class);
                        listValues.add(q.getA()); 
                        keyValues.add(postSnapshot.getKey()); //This gives me the titleofquestion as a string.
                        Log.d(TAG, "keyValue: "+postSnapshot.getKey());
                }
            }

当我尝试使用此值删除另一个方法中的条目时

   databaseReference.child(keyValues.get(position)).removeValue(); //
keyValues.get(position) gives me title of question

没有任何反应。我该如何解决这个问题?

编辑:我认为我应该使用侦听器进行删除操作,但我不确定

2 个答案:

答案 0 :(得分:1)

databaseReference.child(keyValues.get(position)).setValue("");

可能是这样,通过将键的值设置为("")即为空

答案 1 :(得分:0)

您的代码归结为:

databaseReference = FirebaseDatabase.getInstance().getReference().child("question");
keyValues.get(position) gives me title of question
databaseReference.child(keyValues.get(position)).removeValue(); //

因此,您要删除路径中的值:/question/<titleofquestion>

您的JSON结构与此路径不匹配,因为您在其中有推送ID:/question/<pushid>/<titleofquestion>。所以你拥有的代码(成功)删除了一个不存在的值。

我可以想到两个解决方案:

  1. 不使用推送ID
  2. 存储问题的路径,而不仅仅是密钥
  3. 从您分享的JSON中,我们无法看到为什么您在那里拥有推送ID的级别。如果不是严格需要,可以将数据模型简化为:

    game
     question
       titleofquestion
        a: 
        "test"
        b: 
        "test"
        c: 
        "test"
    

    然后您当前的代码已经可以使用了。

    如果数据模型中需要推送ID,您将获得每个问题的完整路径以便将其删除。

    首先,您存储整个路径而不仅仅是密钥:

    databaseReference = FirebaseDatabase.getInstance().getReference().child("question");
    databaseReference.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
                Question q = postSnapshot.getValue(Question.class);
                    listValues.add(q.getA()); 
                    keyValues.add(dataSnapshot.getKey()+"/"+postSnapshot.getKey()); //This gives the path to the question
            }
        }
    

    然后您可以使用当前代码删除该问题:

    databaseReference.child(keyValues.get(position)).removeValue();
    keyValues.get(position) gives the path of question