【问题标题】:How to delete first n rows in realm如何删除领域中的前n行
【发布时间】:2016-12-26 07:00:24
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:
    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();
    }
    

    【讨论】:

    • 删除前 1000 行或假设 10^5 行怎么样?实际上我正在寻找没有循环的答案。
    • 除非您有一个可以更新的索引,否则您不会找到一个无循环的答案,您可以为其定义一个查询,通过该查询您可以获得RealmResults,您可以在其上调用deleteAllFromRealm()
    • 我没有完全理解你的想法,也许你想要一个只能获取前 n 行并调用 deleteAllFromRealm() 的列。如果你能详细说明会更好。
    • @mahbub.kuet 完全正确。
    • 据我所知,Realm 不知道“行数”的概念。所以你要么循环,要么定义一个条件,给你你想要的。
    【解决方案2】:

    由于 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 的一半,因此此清理不会随着新记录的添加而不断运行,但您可以随意调整。

    我也删除了第一个超过限制的记录,但是你可以玩边界并保留它。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多