2016-08-07 2 views
0

これはfirebaseに新しいオブジェクトを追加する私のコードです。androidのフルURLを知らずに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); 
} 

これは問題なく動作します。

今、私は同じオブジェクトを削除したいと思います。私は場所(完全なURL)を知らない。これは私が今までに書いたコードです。

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

削除するアイテムの「キー」がわからない場合は、削除するアイテムをどのように識別しますか?または、同じ 'pid'を持つすべての子アイテムを削除しますか? –

+0

@FrankvanPuffelen、私は関数の引数として同じpidとvid passを持つ単一の項目だけを削除したい。 –

答えて

1

条件に一致するアイテムが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(); 
    } 
    }) 
} 

あなたはこのコードは、削除する項目を検索するユーザーのための全製品のリストをロードすることに注意しましょう。これは、2つの値(pidvid)をチェックする必要があるため、Firebaseクエリは単一の条件に対してのみチェックできます。これがパフォーマンスの問題である場合は、2つの値を組み合わせたヘルパープロパティを追加することを検討できます(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(); 
} 
関連する問題