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