假设有一个名为RecentViewItem的表,它存储用户最近查看的项目。我想通过删除所有其他项目仅保留前 10 个最近查看的项目。我的查询是这样的:
RealmResults<RecentViewItem> results =
realm.where(RecentViewItem.class)
.findAllSorted("updatedAt", Sort.DESCENDING);
// What to do next ?
假设有一个名为RecentViewItem的表,它存储用户最近查看的项目。我想通过删除所有其他项目仅保留前 10 个最近查看的项目。我的查询是这样的:
RealmResults<RecentViewItem> results =
realm.where(RecentViewItem.class)
.findAllSorted("updatedAt", Sort.DESCENDING);
// What to do next ?
RealmResults<RecentViewItem> results = realm.where(RecentViewItem.class).findAllSorted("updatedAt", Sort.DESCENDING);
for(int i = 0, size = results.size(); i < 10 && i < size; i++) {
RecentViewItem recentViewItem = results.get(i);
recentViewItem.deleteFromRealm();
}
由于 Realm for 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
,因此当添加新记录时,这种清理不会持续运行,但您可以随意调整它。
我也在删除超过限制的第一条记录,但您可以使用边界并保留它。
此外,我的时间戳非常准确,但如果你的日期只是“今天”,那么你会得到更模糊的结果。