Как удалить данные Firebase через "n" дней

Я хочу удалить старые данные из моего Friebase. Я знал, что этот вопрос часто задавался здесь, но мне все еще трудно сделать это.

Я пробую это решение, найденное здесь:

Firebase chat - удаление старых сообщений

но это не рекомендуется.

поэтому я попробую это так:

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

        }

для объяснения: в моей Firebase я сохраняю объект с именем Marker, у этого объекта есть переменная для хранения сохраненной информации, дата, когда объект был сохранен в Firebase.

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

Я хочу удалить объект в Firebase через 30 дней. Поэтому я пытаюсь вычесть 30 дней из даты сегодня, чем я хочу сравнить это с сохраненным из объекта, если оно равняется, я удалю объект из базы Firebase.

Для Substraction я обращаюсь к следующему ответу:

Как вычесть X дней из даты, используя календарь Java?

Но это не работает. Если я сегодня добавлю Объект в базу Firebase, две даты всегда будут одинаковыми. Так что я думаю, вычитание не работает.

Что я делаю неправильно?

2 ответа

Решение

Скажем, у вас есть структура данных с узлами в строке:

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

Каждый такой узел имеет timestamp свойство, которое указывает, когда оно было создано. Желательно, чтобы вы установили это свойство, используя метку времени сервера.

С помощью этой структуры данных вы можете легко создать запрос, который возвращает только элементы старше 30 дней и удаляет их:

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) {
        throw databaseError.toException();
    }
});

Моя структура Firebase имеет вид -> firebaseurl.com/test/user_id/2017-05-12, а затем мои данные структурированы со временем, поэтому я использую

long cutoff = new Date().getTime()-TimeUnit.MILLISECONDS.convert(10, TimeUnit.DAYS);

//Get days number for delete data
Date d = new Date(cutoff );
SimpleDateFormat dateFormatGmt = new SimpleDateFormat("yyyy-MM-dd");
String old_date = `dateFormatGmt.format(new Date(cutoff));

// Get date of deleting content
ref2 = new Firebase("firebaseurl.com/test/user_id/" + user_id);    // Firebase url
ref2.child(old_date).removeValue();    //Remove element

Меня устраивает

Другой вариант - использовать облако PubSub google с функциями расписания из firebase, я использую и читаю документы все дни (поле каждый день), и я проверяю, если дата (зарегистрированная при создании документа)> этой сегодняшней даты, тогда я должен удалить документ из хранилища, поскольку он;

Другие вопросы по тегам