Swift Realm“Group By”类似于安卓房间数据库

dsf9zpds  于 2023-03-07  发布在  Swift
关注(0)|答案(1)|浏览(193)

我在我的项目中使用领域,并在这里注册类别名称
我想把相同的类别列成一组,并在这个列表旁边写上组号。
这是我的领域数据库:

import RealmSwift

class CatList: Object {
    @objc dynamic var catname: String = ""
}

我可以用这个代码列出数据:

let realm = try! Realm()
var Items: Results<CatList>?

override func viewDidLoad() {
    super.viewDidLoad()
    Items = realm.objects(CatList.self)
}

假设数据库中有5个类别
Green
黄色
红色
黄色
Green
我必须列出相同的类别一次,并在旁边打印总数。
所以应该是这样的;

Green 2
---------
Yellow 2
---------
Red 1

注意:为了提供帮助,我可以在android房间上这样做。
@Query("Select id, catname, COUNT(catname) AS total FROM catlist GROUP BY catname ORDER BY total DESC")
抱歉,我英语不好。

6l7fqoea

6l7fqoea1#

领域结果是同质的;它们将仅包含一种类型的数据。
因此,Realm查询将只返回一种类型的对象,因此您不能通过Realm查询同时直接提取类别名称和计数 *
但解决方法很简单捕获唯一的类别列表,遍历它们并输出每个类别的计数。

let results = realm.objects(CatList.self).distinct(by: ["catname"])
for category in results {
    let cat = category.catname
    let count = realm.objects(CatList.self).where { $0.catname == cat}.count
    print("category: \(cat) has a count of \(count)")
}

几点注意事项:此时,最好使用@Persisted转移到更现代的Realm实现

class CatList: Object {
    @Persisted var catname = ""
}

另外,为了可读性,因为对象不是列表,而是单个对象,CatList可能更适合命名为Category。

  • 以上是一个Realm和内存友好的解决方案,以延迟加载的方式处理数据。也就是说,一行程序很可能通过Swift高阶函数实现--但是,如果数据集很大或大小未知,通常不推荐这样做。

相关问题