1

假设有一个名为RecentViewItem的表,它存储用户最近查看的项目。我想通过删除所有其他项目仅保留前 10 个最近查看的项目。我的查询是这样的:

RealmResults<RecentViewItem> results = 
    realm.where(RecentViewItem.class)
         .findAllSorted("updatedAt", Sort.DESCENDING);
// What to do next ?
4

2 回答 2

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();
}
于 2016-12-26T17:45:03.077 回答
0

由于 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,因此当添加新记录时,这种清理不会持续运行,但您可以随意调整它。

我也在删除超过限制的第一条记录,但您可以使用边界并保留它。

此外,我的时间戳非常准确,但如果你的日期只是“今天”,那么你会得到更模糊的结果。

于 2018-05-02T10:45:04.470 回答