如何删除领域中的前n行

时间:2016-12-26 07:00:25

标签: realm realm-mobile-platform realm-list realm-java

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

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

2 个答案:

答案 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的一半,因此在添加新记录时,此清理不会持续运行,但您可以根据需要调整它。

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

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