java - 如何在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) {
}
});
}
});
解决方案
要删除一个节点,您需要知道它的完整路径。如果您只知道节点(的属性)的值,则可以运行查询以查找与该值匹配的所有节点。
就像是:
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
,因为你永远不应该忽略错误。
推荐阅读
- indexing - 有没有办法将 Couchbase 索引添加到版本控制中?
- r - R中的异常处理-下载正确的数据时返回
- php - 我无法将 data_type 从 TINYTEXT 更改为 DATE&/DATETIME
- reactjs - 如何使用钩子将对象数组推入状态
- react-native - 在 Parent 中传递两个函数
- mysql - MySQL - 选择具有字段值 > 10 且不按此字段排序的第一行的查询
- python - 如何使用蓝牙将数据从 Android/iOS 应用程序发送到在树莓派上运行的 python 脚本?
- bluetooth - 我可以使用蓝牙 4.0 设备知道蓝牙 5.1 信标的位置吗?
- graphql - 在 GraphQL 中,您可以更改别名中的输出结构吗?
- docker - 如何在 docker-compose 中使用 docker 容器选项