如何在不知道android中的完整URL的情况下删除firebase中的对象

时间:2016-08-07 15:30:28

标签: android firebase firebase-realtime-database

这是我在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);
}

如何在该位置获取键值并删除数据对象?

1 个答案:

答案 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();
    }
  })
}

您会注意到此代码会加载整个产品列表,以便用户找到要删除的项目。这样做的原因是您需要检查两个值(pidvid),而Firebase查询只能针对单个条件进行检查。如果这是性能问题,您可以考虑添加一个组合这两个值的辅助属性(请参阅Query based on multiple where clauses in firebase)。

由于您说pidvid的组合对您的应用来说是唯一的,您甚至可以考虑将这些组合作为产品的关键,而不是使用推送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();
}