2017-07-06 169 views
1

從addChildEventListener調用以下函數,以便在需要時從我的Firebase數據庫中刪除特定節點。 這裏的問題是函數啓動「刪除項目」。表示任務已成功執行,但該節點保持在數據庫上。Android - 關於從Firebase數據庫中刪除節點的問題

有人能告訴我什麼是錯的?

private void showData(DataSnapshot ds) { 
 
    String keyValue = null; 
 

 
    if(ds.hasChildren()) { 
 
     keyValue = ds.getKey(); 
 

 
     Toast.makeText(getActivity().getApplicationContext(), "Removing item...", Toast.LENGTH_SHORT).show(); 
 
     ds.getRef().child(keyValue).removeValue().addOnCompleteListener(new OnCompleteListener<Void>() { 
 
      @Override 
 
      public void onComplete(@NonNull Task<Void> task) { 
 
       if (task.isSuccessful()) { 
 
        Toast.makeText(getActivity().getApplicationContext(), "Item removed.", Toast.LENGTH_SHORT).show(); 
 
       } else { 
 
        Toast.makeText(getActivity().getApplicationContext(), "Something bad happened while removing item.", Toast.LENGTH_SHORT).show(); 
 
       } 
 
      } 
 
     }); 
 
    } 
 
}

編輯 如果有幫助,我的查詢如下:

orderItemsByTime = db.getInstance().getReference().child("items").orderByChild("time"); 
+0

你試圖刪除'.getRef()'當你'addOnCompleteListener'? –

+0

做到了。不幸的是,沒有工作。 –

回答

0

一個可能的解釋是,ds.getRef().child(keyValue)沒有指向你想要的位置。當在不存在的位置執行remove()時,這不是錯誤。 task.isSuccessful()返回true。

添加一些調試日誌記錄(或烘烤),以示對ds.getRef().child(keyValue)路徑:

Toast.makeText(getActivity().getApplicationContext(), "Removing item at " + 
     ds.getRef().child(keyValue), Toast.LENGTH_SHORT).show(); 

Log.d(TAG, "Removing item at " + ds.getRef().child(keyValue)); 
+0

我在這裏發佈這個問題後,添加了您建議的敬酒。它顯示我想要刪除的特定路徑。其他一些建議? –

+0

@LavitzBr:你確定路徑正確嗎?鑰匙不會出現兩次?那是你要的嗎?例如:如果快照的路徑是'/ test/post',則鍵是'post',而刪除的路徑是'/ test/post/post'。 –

+0

如果有幫助,我使用的查詢是orderItemsByTime = db.getInstance()。getReference()。child(「items」)。orderByChild(「time」)。 Toast顯示了我想要刪除的項目的數據庫密鑰的路徑;我在Firebase控制檯中瀏覽數據庫時看到的路徑相同。 –