worl44 worl44 - 6 months ago 96
Java Question

How to delete firebase data after "n" days

I want do delete some old data from my Friebase. I knew this question asked a lot here, but i have still a hard time do make it work.

I try this solution found here:

Firebase chat - removing old messages

but this ist deprecated.

so i try it this way:

ChildEventListener childEventListener = new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {

Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DAY_OF_MONTH, -30);


Log.d(TAG, "onChildAdded:" + dataSnapshot.getKey());

String key = dataSnapshot.getKey();

Marker retrievemarker =dataSnapshot.getValue(Marker.class);
Calendar t3 = new
GregorianCalendar
(c.get(Calendar.YEAR),
c.get(Calendar.MONTH),
retrievemarker.getSavedate());

int date1= calendar.get(Calendar.DATE);
int date2= t3.get(Calendar.DATE);

Log.d("date1",""+date1);
Log.d("date2",""+date2);

if( date1 == date2 ){

myRef.child(key).setValue(null);

}


for explanation:
In my Firebase i save a object named Marker, this object got a variable to store the savedate, the date where the object was saved in the Firebase.

int date = c.get(Calendar.DATE);
marker.setSavedate(date);


I want to delete the object in the Firebase after 30 days. So i try to subtract 30 days from the Date Today than i want to compare this with the savedate from the Object if it equals i will delete the object from the Firebase.

For the Substraction i refer to the following answer:

How to subtract X days from a date using Java calendar?

But it dosen´t work. If i add a Object today to the Firebase the two dates are allways equal.
So i guess the subtraction dosen´t work.

What am I doing wrong?

Answer

Say that you have a data structure with nodes line this:

-KItqNxLqzQoLnUCb9sJaddclose
  time: "Thu Apr 28 17:12:05 PDT 2016"
  timestamp: 1461888725444

Each such node has a timestamp property that indicates when it was created. Preferably you'd set this property using Server Timestamp.

With this data structure, you can easily build a query that returns only the items older than 30 days and removes them:

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

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