这是我在firebase中添加新对象的代码。
private void addProductVariant(String pid, String vid, String mrp, String sellPrice) {
final String uid = getUid();
String key = databaseReference.child("shops-product-list").child(uid).push().getKey();
ShopProductVariant shopProductVariant = new ShopProductVariant(pid, vid, mrp, sellPrice);
Map<String, Object> shopProductVariantValues = shopProductVariant.toMap();
Map<String, Object> childUpdates = new HashMap<>();
childUpdates.put("/shops-product-list/" + uid + "/"+ key, shopProductVariantValues);
databaseReference.updateChildren(childUpdates);
}
这很好用。
现在我要删除同一个对象。我不知道位置(完整网址)。这是我到目前为止编写的代码。
private void deleteProductVariant(String pid, String vid, String mrp, String sp){
final String uid = getUid();
ShopProductVariant shopProductVariant = new ShopProductVariant(pid, vid, mrp, sp);
//databaseReference.child("shops-product-list").child(uid).child("product-list").setValue(shopProductVariant);
//mDatabase.child("users").child(userId).child("username").setValue(name);
}
如何在该位置获取键值并删除数据对象?
答案 0 :(得分:1)
如果只有一个项目符合条件,我建议将该项目的密钥保存在某处。查找相同的项目既比需要的更昂贵,并且可能在某些时候成为问题。
但在你目前的要求范围内,这应该有效:
private void deleteProductVariant(String pid, String vid, String mrp, String sp){
final String uid = getUid();
DatabaseReference listRef = databaseReference.child("shops-product-list").child(uid).child("product-list");
listRef. addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
for (DataSnapshot variantSnapshot: snapshot.getChildren()) {
ShopProductVariant variant = variantSnapshot.getValue(ShopProductVariant.class);
if (variant.pid == pid && variant.vid == void) {
variantSnapshot.getRef().removeValue();
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
throw databaseError.toException();
}
})
}
您会注意到此代码会加载整个产品列表,以便用户找到要删除的项目。这样做的原因是您需要检查两个值(pid
和vid
),而Firebase查询只能针对单个条件进行检查。如果这是性能问题,您可以考虑添加一个组合这两个值的辅助属性(请参阅Query based on multiple where clauses in firebase)。
由于您说pid
和vid
的组合对您的应用来说是唯一的,您甚至可以考虑将这些组合作为产品的关键,而不是使用推送ID:
String key = pid + "_" + vid;
删除然后变得如此简单:
private void deleteProductVariant(String pid, String vid, String mrp, String sp){
final String uid = getUid();
DatabaseReference listRef = databaseReference.child("shops-product-list").child(uid).child("product-list");
DatabaseReference itemRef = listRef.child(pid + "_" + vid);
itemRef.removeValue();
}