2016-08-07 6 views
0

Dies ist mein Code, um ein neues Objekt in Firebase hinzuzufügen.So löschen Sie ein Objekt in Firebase, ohne die vollständige URL in Android zu kennen

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); 
} 

Das funktioniert gut.

Jetzt möchte ich das gleiche Objekt löschen. Ich kenne den Standort nicht (vollständige URL). Das ist Code, den ich bisher geschrieben habe.

Wie Schlüsselwert erhalten und Datenobjekt an diesem Ort löschen?

+0

Wenn Sie den 'Schlüssel' des zu löschenden Elements nicht kennen, wie identifizieren Sie, welche der untergeordneten Elemente gelöscht werden sollen? Oder möchten Sie alle untergeordneten Elemente mit demselben 'pid' löschen? –

+0

@FrankvanPuffelen, ich möchte nur einzelne Artikel mit der gleichen PID und VID Pass als Funktion Args löschen. –

Antwort

1

Wenn es nur ein einzelnes Element gibt, das den Bedingungen entspricht, würde ich empfehlen, den Schlüssel dieses Elements irgendwo zu behalten. Das Nachschlagen des gleichen Artikels ist sowohl teurer als nötig und wird wahrscheinlich irgendwann zu einem Problem werden.

Aber im aktuellen Anforderungen, sollte diese Arbeit:

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

Sie werden bemerken, dass dieser Code die gesamte Produktliste ein Benutzer das Element zu finden lädt zu löschen. Der Grund dafür ist, dass Sie zwei Werte überprüfen müssen (pid und vid), während Firebase-Abfragen nur mit einer einzigen Bedingung überprüfen können. Wenn es sich um ein Leistungsproblem handelt, können Sie eine Hilfseigenschaft hinzufügen, die die beiden Werte kombiniert (siehe Query based on multiple where clauses in firebase).

Da Sie sagen, dass die Kombination von pid und vid für Ihre Anwendung einzigartig ist, könnten Sie sogar erwägen, von den als Schlüssel Ihrer Produkte verwenden stattdessen eine Push-ID verwenden:

String key = pid + "_" + vid; 

dann Löschen wird so einfach wie:

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(); 
} 
Verwandte Themen