Swift Realm实现类似Android Room的Group By分组统计需求
Realm实现分类名称分组统计(按catname分组并计数)
Realm本身没有像Room那样直接支持GROUP BY COUNT的查询语法,但可以通过以下两种方式实现需求:
方法一:去重查询+逐个统计(适合小数据量)
先查询所有不重复的分类名称,再逐个统计每个分类的出现次数:
Java代码示例
Realm realm = Realm.getDefaultInstance(); // 获取所有去重的catname RealmResults<CatList> distinctCatNames = realm.where(CatList.class).distinct("catname"); // 存储分类与对应数量 Map<String, Integer> catCountMap = new HashMap<>(); for (CatList cat : distinctCatNames) { String name = cat.getCatname(); long count = realm.where(CatList.class).equalTo("catname", name).count(); catCountMap.put(name, (int) count); } // 输出结果(示例) for (Map.Entry<String, Integer> entry : catCountMap.entrySet()) { System.out.println(entry.getKey() + " " + entry.getValue()); } realm.close();
Kotlin代码示例
val realm = Realm.getDefaultInstance() val distinctCatNames = realm.where(CatList::class.java).distinct("catname") val catCountMap = mutableMapOf<String, Int>() distinctCatNames.forEach { cat -> val name = cat.catname val count = realm.where(CatList::class.java).equalTo("catname", name).count().toInt() catCountMap[name] = count } // 输出结果 catCountMap.forEach { (name, count) -> println("$name $count") } realm.close()
方法二:全量查询+内存分组(适合大数据量,性能更优)
一次性查询所有数据,利用语言特性在内存中完成分组统计,避免多次数据库查询:
Kotlin代码示例
val realm = Realm.getDefaultInstance() // 查询所有分类数据 val allCats = realm.where(CatList::class.java).findAll() // 按catname分组并统计每组数量 val catCountMap = allCats.groupBy { it.catname }.mapValues { it.value.size } // 输出结果 catCountMap.forEach { (name, count) -> println("$name $count") } realm.close()
Java代码示例
Realm realm = Realm.getDefaultInstance(); RealmResults<CatList> allCats = realm.where(CatList.class).findAll(); Map<String, Integer> catCountMap = new HashMap<>(); for (CatList cat : allCats) { String name = cat.getCatname(); catCountMap.put(name, catCountMap.getOrDefault(name, 0) + 1); } // 输出结果 for (Map.Entry<String, Integer> entry : catCountMap.entrySet()) { System.out.println(entry.getKey() + " " + entry.getValue()); } realm.close();
注意事项
- 如果
catname存在null值,需要额外处理(比如单独分组为"未知分类") - 大数据量场景下优先选择方法二,减少数据库IO操作
内容的提问来源于stack exchange,提问作者strawberrygirl20
相关产品推荐
相关产品推荐

