如何通过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
相关产品推荐
相关产品推荐

