2017-01-31 2 views
0

Ich habe folgende Datenbankstruktur in Firebase. Es ist eine ziemlich normale Art, Benutzer und ihre Daten in der Datenbank zu verwalten. Ich nutze auch FirebaseRecyclerAdapter in FirebaseUI.Hinzufügen von Daten an bestimmten Speicherort in Firebase-Datenbank

Jetzt möchte ich Swipe zu löschen/rückgängig machen Funktion implementieren. Für den Swipe, um Teil zu löschen, hatte ich implementiert ItemTouchHelper.SimpleCallback Methode, um onSwiped Status zu fangen. In der Callback aktualisiere ich einfach die Datenbank

mFirebaseAdapter.getRef(indexOfDeletedItem).removeValue();

Auf diese Weise verwendet wird, wurde die Swiped Artikel sofort in der Datenbank entfernt. Jedoch, wenn ich versuche, es wieder herzustellen. Ich kann nicht einfügen, wo es war. Zum Beispiel

@Override 
     public void onSwiped(final RecyclerView.ViewHolder viewHolder, int direction) { 
      //get the location of swiped item. 
      final int indexOfDeletedItem = viewHolder.getAdapterPosition(); 

      //I cached the item in case I need to restore it. 
      final ITEM deletedItem = mFirebaseAdapter.getItem(indexOfDeletedItem); 

      //remove the item on swipe 
      mFirebaseAdapter.getRef(indexOfDeletedItem).removeValue(); 

      Snackbar.make(findViewById(R.id.myCoordinatorLayout), "Deleted Item", Snackbar.LENGTH_LONG) 
        .setAction("UNDO", new View.OnClickListener() { 
         @Override 
         public void onClick(View v) { 
          //When user want to restored the deleted item 
          //I need to add the deleted data back to database. 
       mFirebaseAdapter.getRef(indexOfDeletedItem).push()setValue(deletedItem); 

                } 
         }).show(); 
    } 

Ich bin richtig nicht in der Lage einfügen (add) die Daten in bestimmten Ort ohne es zu überschreiben. bekam Ich denke, der Index des Artikels sofort aktualisiert, nachdem ich mFirebaseAdapter.getRef(indexOfDeletedItem).removeValue();

Zum Beispiel genannt, für user1 Ich habe item0 mit Index 0,

item1 mit Index 1 und

item2 mit Index 2

index  0  1   2 

     item0 --> item1 --> item2 //now swipe on item1 

     item0 --> item2    //now user click undo 

     item0 --> item1    //item2 gets overwritten 

, wenn es eine Möglichkeit, es zu machen, zurück zu

 item0 --> item1 --> item2 

In meinem Fall habe ich die Daten auf indexOfDeletedItem immer überschrieben.

Ich bin auf der Suche nach einer API, um den Knoten zurück in die Datenbank einfügen, ohne es zu überschreiben. Mit anderen Worten: Wie kann ich den Knoten (item1) dorthin schieben, wo er vorher war?

+0

Ich bin nicht sicher, was Sie über Insert vs Überschreiben in dieser Frage bedeuten. Können Sie die Frage bearbeiten, um deutlicher zu machen, was Sie tun möchten und was tatsächlich passiert? –

+0

Ich füge nur ein Beispiel hinzu, ich hoffe, das hilft. :) –

Antwort

1

Das Problem ist, dass wenn Sie das Element wiederherstellen, die Referenz des Adapters geändert wird und Sie eine andere Referenz erhalten. Erstellen Sie eine lokale Kopie der Datenbankreferenz, bevor Sie das Element löschen. Z.B.

DatabaseReference ref = mFirebaseAdapter 
getRef(indexOfDeletedItem); 

Später in der snackbar Aktion können Sie rufen Sie einfach an:

ref.setValue(deletedItem); 
+0

Danke für die Hilfe. Genau danach suche ich. –

Verwandte Themen