You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Realm Query获取连续相同collection值的首个ID?

解决Realm中获取连续相同collection首个id的问题

嘿,这个需求确实很实际——要抓取连续相同collection值对应的首个id,对吧?我来帮你拆解一下怎么在Realm里实现。

首先得明确:纯Realm Query语句没办法直接完成这个需求,因为Realm的查询语言不支持SQL里的窗口函数(比如LAG()),没法直接对比当前行和前一行的collection值。不过我们可以结合Realm的查询+客户端逻辑来实现,步骤很简单:

步骤1:获取按id排序的数据集

因为我们要判断“连续”,必须保证数据是按id递增排序的(你的数据id本身就是自增的,刚好符合),先用Realm Query拿到排序后的结果:

// 替换YourModel为你的实际数据模型类名
RealmResults<YourModel> sortedItems = realm.where(YourModel.class)
    .sort("id") // 按id升序排序,保证顺序正确
    .findAll();

步骤2:遍历数据集,提取连续组的首个id

接下来遍历排序后的结果,记录每个连续collection组的第一个id:

List<Integer> targetIds = new ArrayList<>();
if (!sortedItems.isEmpty()) {
    // 初始化第一个元素的collection和id
    String currentCollection = sortedItems.get(0).getCollection();
    targetIds.add(sortedItems.get(0).getId());
    
    // 从第二个元素开始遍历
    for (int i = 1; i < sortedItems.size(); i++) {
        YourModel currentItem = sortedItems.get(i);
        // 如果当前元素的collection和上一个组不同,记录id并更新当前组
        if (!currentItem.getCollection().equals(currentCollection)) {
            currentCollection = currentItem.getCollection();
            targetIds.add(currentItem.getId());
        }
    }
}
// 最终targetIds就是你要的结果:[1, 3, 5, 6, 7]

补充说明

  • 性能方面不用担心:Realm的RealmResults是懒加载的,只有在你访问元素的时候才会真正读取数据,所以即使数据量较大,这种遍历的性能开销也很低(如果数据量极大,建议放在后台线程执行)。
  • 如果你的模型类用的是Kotlin,逻辑是完全一样的,只是语法稍有不同,比如用mutableListOf()代替ArrayList,遍历用forEachIndexed之类的写法就行。

内容的提问来源于stack exchange,提问作者Alvin John

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:52:46