2016-12-23 4 views
0

Ich habe versucht, diese Arbeit zu machen vonLöschen von Daten Firebase nach einer gewissen Zeit

How to delete firebase data after "n" days

aber es funktioniert nicht für mich.

Hier ist, was ich tue,

In meiner „A“ Tätigkeit, ich habe eine Schaltfläche, die diesen Teil der Daten speichern werden, mit einem Kind ‚timestamp‘, die den Zeitstempel Wert hält. (.setValue (ServerValue.TIMESTAMP);)

Nach dem Drücken der Taste werden die Daten erfolgreich gespeichert. Dann beginnt die nächste Aktivität, wo wir warten.

Aber anstatt nach '30' Tagen zu löschen, löscht es sofort.

Ich habe eine Methode, die genau wie die Antwort von Frank arbeitet

long cutoff = new Date().getTime() - TimeUnit.MILLISECONDS.convert(30, TimeUnit.DAYS); 
    Query oldBug = mDatabase.orderByChild("timeStamp").endAt(cutoff); 
    oldBug.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot snapshot) { 
      for (DataSnapshot itemSnapshot: snapshot.getChildren()) { 
       itemSnapshot.getRef().removeValue(); 
      } 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 
     } 
    }); 

Aber es ist nicht es nach einiger Zeit zu löschen, sobald es veröffentlicht wird.

Vielen Dank.

EDIT:

data

+0

Wenn ich den Code ausführen, den Sie veröffentlicht haben, verhält es sich wie erwartet. Exportieren und veröffentlichen Sie ein Teil Ihrer Datenbank, in dem die Struktur- und Zeitstempelwerte angezeigt werden. –

+0

@qbix danke, ich habe ein Bild von meinen Daten in die obige Frage unter EDIT gesetzt. – SaltySea

+0

Ich vermute, Referenz 'mDatabase' ist nicht korrekt eingestellt. Veröffentlichen Sie den Code, der es definiert. –

Antwort

0

Die orderByChild() Sortiermethode ist sehr nachsichtig. Die sortierten Kinder müssen kein Mitglied mit dem angegebenen Feldnamen haben. Die documentation erklärt, dass diese Kinder einen Nullwert zugewiesen und zuerst in der Sortierung angezeigt werden. Wenn der Verweis, der zum Erstellen einer Abfrage verwendet wird, falsch angeordnet ist, schlägt die Abfrage daher nicht fehl, sondern gibt normalerweise alle untergeordneten Elemente dieses Standorts zurück.

Sie erstellt Ihre oldBug Abfrage mDatabase mit denen:

DatabaseReference mDatabase = FirebaseDatabase.getInstance().getReference(); 

Dieses Niveau zu hoch ist. Es sollte sein:

Query oldBug = mDatabase.child("Users").orderByChild("timeStamp").endAt(cutoff); 
+0

Danke, das hat es geschafft! Übrigens habe ich ein kleines Problem. Wie kann ich es bekommen, so dass es in Echtzeit löscht? – SaltySea

+0

Sie müssen erklären, was Sie mit "in Echtzeit" meinen. –

+0

Zum Beispiel, wenn ich die Daten nach 5 Minuten löschte, sollte es die Daten GENAU nach 5 Minuten löschen. Nicht 5 Minuten und bis zum Aktualisieren. – SaltySea

0

Ich denke, man könnte prüfen, ein neues untergeordnetes Element gibt, die einen Zeitstempel und Datum hat, so dass Sie es zurück verweisen können, wenn eine Abfrage für das Datum und die Zeit zu tun . Auf diese Weise müssen Sie sich nicht um falsche Werte kümmern und Sie können sicherstellen, dass Sie die richtigen Daten löschen. Ich hoffe das hilft.

Verwandte Themen