Swift Realm“Group By”像安卓房间数据库

问题描述 投票:0回答:1

我在我的项目中使用领域并在这里注册类别名称

我想列出与一组相同的类别,并在列表旁边写下组号。

这是我的领域数据库:

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 2
---------
Yellow 2
---------
Red 1

注意:为了提供帮助,我可以按如下方式在 android Room 上执行此操作。

@Query("Select id, catname, COUNT(catname) AS total FROM catlist GROUP BY catname ORDER BY total DESC")

对不起我的英语不好。

ios swift realm
1个回答
0
投票

Realm结果是同质的;它们将只包含一种类型的数据。

因此 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。

*以上是以 lazy-loading 方式处理数据的领域和内存友好解决方案。也就是说,使用 Swift 高阶函数可能会实现单行代码——但是,如果数据集很大或大小未知,通常不推荐这样做。

© www.soinside.com 2019 - 2024. All rights reserved.