Поскольку Realm для Java лениво загружает свои данные, не существует LIMIT
запроса, который добавляет немного работы. Я запрашиваю все данные, отсортированные по отметке времени (в вашем случае updatedAt
).
Realm realm = Realm.getDefaultInstance();
final RealmResults<RecentViewItem> results = realm.where(RecentViewItem.class).findAllSorted("timestamp", Sort.DESCENDING);
Я проверяю, превышает ли он мой предел, и, если это так, получаю результат на пороге, чтобы я мог получить его timestamp
. Затем я запрашиваю эту пороговую метку времени и удаляю все результаты до нее.
if (results.size() > UPPER_LIMIT) {
RecentViewItem firstOverLimit = results.get(TRUNCATE_LIMIT);
// Assuming a system time. Maybe your updatedAt is a date. Could use an id too.
long threshold = firstOverLimit.timestamp;
final RealmResults<RecentViewItem> resultsToDelete = realm.where(RecentViewItem.class).lessThanOrEqualTo("timestamp", threshold).findAll();
Log.d(TAG, "cleanUp: total "+ results.size() +
"; over threshold of " + UPPER_LIMIT +
"; truncating to " + TRUNCATE_LIMIT +
"; deleting " + resultsToDelete.size() +
"; all on or before "+ threshold);
realm.executeTransaction(realm1 -> resultsToDelete.deleteAllFromRealm());
}
Мой TRUNCATE_LIMIT
составляет половину моего UPPER_LIMIT
, так что эта очистка не выполняется постоянно по мере добавления новых записей, но вы можете настроить это по своему усмотрению.
Я также удаляю первую запись сверх лимита, но вы можете поиграть с границей и сохранить ее.
Кроме того, моя временная метка довольно точна, но если ваша дата просто «сегодня», вы получите более нечеткие результаты.
person
LordParsley
schedule
02.05.2018