首页 > 解决方案 > 如何在firebase数据库中获取与特定值配对的随机键并删除该值?

问题描述

我有一个简单的数据库结构,如下所示:

数据库杰森

我需要earphone使用它的键来删除该值,即-M-4XBDqv-ve396r5EHm. 我有一个用于删除该值的按钮,我想使用这行代码将其删除: mReferenceForListA.child("List A").child("Items").child(key).removeValue().

但是我如何获得钥匙earphone呢?

我知道我可以直接写 mReferenceForListA.child("List A").child("Items").child(-M-4XBDqv-ve396r5EHm).removeValue() 删除earphone,但是如果我需要删除列表中的其他项目怎么办?

我需要将一个特定的键传递给一个名为“key”的变量来删除一个特定的值。那么,再一次,我怎样才能在我当前的 JSON 结构中获得我想要删除的值的特定键?


这是我尝试过的:

在stackoverflow中阅读了几天的相关帖子,我开始编写以下代码,但我认为我还没有掌握这件事的窍门,并且非常需要帮助。以下代码总是删除整个“List A”节点,但在这种情况下,我只需要删除一个指定值并保持节点中的其他值不变。

public static DatabaseReference mRootReference = FirebaseDatabase.getInstance().getReference();
public static DatabaseReference mReferenceForListA = mRootReference.child("List A");

deleteButton= findViewById(R.id.delete_button)  

deleteButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {

        mReferenceForListA.child("Items").addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                for (DataSnapshot postsnapshot :dataSnapshot.getChildren()) {
                    String key = postsnapshot.getKey();
                    mReferenceForListA.child("Items").child(key).removeValue();
                }

            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });

    }
});

标签: javaandroidfirebasefirebase-realtime-databasenodes

解决方案


要删除一个节点,您需要知道它的完整路径。如果您只知道节点(的属性)的值,则可以运行查询以查找与该值匹配的所有节点。

就像是:

public static DatabaseReference mRootReference = FirebaseDatabase.getInstance().getReference();
public static DatabaseReference mReferenceForListA = mRootReference.child("List A");
Query query = mReferenceForListA.child("Items").orderByValue().equalTo("earphone");

query.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        for (DataSnapshot snapshot: dataSnapshot.getChildren()) {
            snapshot.getRef().removeValue();
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        throw databaseError.toException();
    }
});

主要变化:

  • 以上使用orderByValue()Items孩子的查询。这意味着 Firebase 直接搜索所有子节点List A/Items并返回其值匹配的子节点earphones
  • 它还使用addListenerForSingleValueEvent, 以便删除只运行一次,而不是连续运行。
  • 它使用snapshot.getRef().removeValue()更短的方法来删除节点。
  • 它实现了onCancelled,因为你永远不应该忽略错误。

推荐阅读