下一行中的DatabaseReference#push() 创建了一个新的DatabaseReference 对象,其中包含基于当前时间随机生成的密钥。这就是数据没有按预期删除的原因,因为您正在“删除”甚至还不存在的数据。
String key = myjsd.push().getKey();
要更正此问题,您需要找到数据库中存在的密钥。为此,您必须首先使用许多available filters 之一为它perform a query。在下面的示例中,我正在搜索包含等于 "jehe" 的 "name" 字段的数据。
Query myjsdQuery = myjsd // the parent Reference
.orderByChild("name") // the property to search on
.equalTo("jehe") // return children that have "name"="jehe"
.limitToFirst(1); // return at most one result
myjsdQuery.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot child : dataSnapshot.getChildren()) {
child.removeValue(new DatabaseReference.CompletionListener() {
@Override
public void onComplete(DatabaseError error, DatabaseReference ref) {
if (error !== null) {
// Failed. TODO: Log/handle exception.
Log.w(TAG, "myjsdQuery:onDeleted", databaseError.toException());
return;
}
Log.i(TAG, "myjsdQuery:onDeleted", "Successfully deleted data!");
}
});
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
// Failed. TODO: Log/handle exception.
Log.w(TAG, "myjsdQuery:onCancelled", databaseError.toException());
}
});
或者,您可以使用类似于JavaScript 中的Promise 的Task 链接来简化上述代码:
Query myjsdQuery = myjsd // the parent Reference
.orderByChild("name") // the property to search on
.equalTo("jehe") // return children that have "name"="jehe"
.limitToFirst(1); // return at most one result
myjsdQuery.get()
.onSuccessTask(new SuccessContinuation<DataSnapshot, String>() {
@NonNull
@Override
public Task<void> then(DataSnapshot dataSnapshot) {
// this is set to work when there is only one child of the returned data!
// you'll need to use Tasks.WhenAll() or a multi-location database update for more than one result
for (DataSnapshot child : parent.getChildren()) {
return child.removeValue();
}
return Tasks.forResult(null); // handle case where there are no results
}
})
.addOnCompleteListener(new OnCompleteListener<void>() {
@NonNull
@Override
public void onComplete(Task<void> task) {
if (!task.isSuccessful()) {
// Failed. TODO: Log/handle exception.
Log.w(TAG, "myjsdQuery:onCompleteError", databaseError.toException());
return;
}
Log.i(TAG, "myjsdQuery:onDeleted", "Successfully deleted data!");
}
});
免责声明:我的 Java 有点生锈,这是徒手编写的,所以可能会有一两个错字。