2017-04-30 3 views
0

Ich habe eine Anwendung erstellt, wo ich mit Firebase db interagiere. Die Struktur folgt.Ich kann ein Kind nicht vom Firebase löschen, obwohl ich es abrufen kann

game 
question 
-KiwYrNcX6B-VSLV8OmQ 
    titleofquestion 
    a: 
    "test" 
    b: 
    "test" 
    c: 
    "test" 

Jetzt, um mein Frageobjekt zu bekommen, habe ich folgendes erfolgreich gemacht.

databaseReference = FirebaseDatabase.getInstance().getReference().child("question"); 
     databaseReference.addChildEventListener(new ChildEventListener() { 
      @Override 
      public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
       for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) { 
        Question q = postSnapshot.getValue(Question.class); 
         listValues.add(q.getA()); 
         keyValues.add(postSnapshot.getKey()); //This gives me the titleofquestion as a string. 
         Log.d(TAG, "keyValue: "+postSnapshot.getKey()); 
       } 
      } 

Wenn ich versuche, diesen Wert zu verwenden, um einen Eintrag in einem anderen Verfahren

databaseReference.child(keyValues.get(position)).removeValue(); // 
keyValues.get(position) gives me title of question 

nichts zu löschen happens.How ich dieses Problem beheben?

Edit: und ich glaube, ich Zuhörer für die Entfernungsoperation verwenden soll, aber ich bin nicht sicher,

+0

Bearbeiten Sie Ihre Frage, die real sind , gültiger JSON. Wie Sie jetzt sagen, ist es schwierig zu sagen, ob 'a' ein Geschwister von' titleofquestion' oder ein Kind davon ist. Sie können dieses JSON abrufen, indem Sie in Ihrer [Firebase-Datenbankkonsole] (https://console.firebase.google.com/project/_/database/data) auf den Link "JSON exportieren" klicken. –

+0

a b und c sind childiren von titleofquestion – Frreshia

Antwort

0

Ihr Code läuft darauf hinaus:

databaseReference = FirebaseDatabase.getInstance().getReference().child("question"); 
keyValues.get(position) gives me title of question 
databaseReference.child(keyValues.get(position)).removeValue(); // 

So sind Sie den Wert am Pfad zu löschen: /question/<titleofquestion>.

Ihre JSON-Struktur stimmt nicht mit diesem Pfad überein, da Sie eine Push-ID dort haben: /question/<pushid>/<titleofquestion>. Der Code, den Sie haben (erfolgreich), löscht einen nicht vorhandenen Wert.

kann ich von zwei Lösungen denken:

  1. nicht eine Push-ID
  2. speichern den Pfad auf die Frage verwenden, anstatt nur den Schlüssel

Vom JSON Ihnen geteilt Wir können nicht sehen, warum Sie das Level mit der Push-ID dort haben. Wenn das nicht unbedingt erforderlich, können Sie das Datenmodell vereinfachen:

game 
question 
    titleofquestion 
    a: 
    "test" 
    b: 
    "test" 
    c: 
    "test" 

Und dann Ihr aktueller Code wird bereits arbeiten.

Wenn die Push-ID im Datenmodell benötigt wird, wird der gesamte Pfad jeder Frage angezeigt, um sie zu löschen.

Also zuerst speichern Sie den gesamten Pfad, anstatt nur den Schlüssel:

databaseReference = FirebaseDatabase.getInstance().getReference().child("question"); 
databaseReference.addChildEventListener(new ChildEventListener() { 
    @Override 
    public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
     for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) { 
      Question q = postSnapshot.getValue(Question.class); 
       listValues.add(q.getA()); 
       keyValues.add(dataSnapshot.getKey()+"/"+postSnapshot.getKey()); //This gives the path to the question 
     } 
    } 

Und dann kann man die Frage mit Ihrem aktuellen Code löschen:

databaseReference.child(keyValues.get(position)).removeValue(); 
keyValues.get(position) gives the path of question 
+0

Ich denke, ich muss Push-ID verwenden, da ich Benutzer zu meiner Datenbank hinzufügen möchten. Mein Fehler war also nicht das Schreiben von dataSnapshot.getKey(). Wenn ich dataSnapshot.getKey() drücke, erhalte ich die eindeutige ID, wie du sagtest, aber warum muss ich postSnapshot.getKey() zur Verfügung stellen, wenn ich bereits die eindeutige Identifikation erzeugt habe, die durch Drücken erzeugt wird? Kann ich nicht einfach alles unter der eindeutigen ID mit dataSnapshot.getKey() löschen? Es hat geklappt, ich akzeptiere und stimme deine Antwort zu, danke. – Frreshia

1
databaseReference.child(keyValues.get(position)).setValue(""); 

dies auch sein mag, durch den Wert des Schlüssels zur Einstellung („“), dh leer

+0

Es erstellt einen neuen Test innerhalb des Elternteils und macht es gleich Null modifiziert nicht den vorhandenen – Frreshia

+0

Aufrufen von 'setValue (" ")' an einer Position, legt den Speicherort auf eine leere Zeichenfolge fest. Der Aufruf von 'setValue (null)' an einem Ort entfernt diesen Ort. –

Verwandte Themen