如何使用Realm Swift Query API筛选首图文件名非空的QuestionModel?
如何用Realm Swift Query API筛选首图filename非空的QuestionModel?
我在Swift项目里用Realm存储数据,想要通过Realm Swift Query API查询List中对象的属性。
数据模型
open class QuestionModel: Object { @objc dynamic var uuid: String! override public static func primaryKey() -> String? { return "uuid" } // 问题的媒体属性封装在MediaModel里 @objc dynamic var media: MediaModel? } open class MediaModel: Object { // 一个问题最多包含两个ImageModel open var images = List<ImageModel>() } open class ImageModel: Object { // 磁盘上用于生成UIImage的文件名 @objc dynamic var filename: String? = nil // 图片描述 @objc dynamic var altDescription: String? = nil }
需求
只获取第一个ImageModel的filename不为空的QuestionModel。
已尝试的方案
- 基础查询(需进一步筛选)
res = realm?.objects(QuestionModel.self)
- NSPredicate+Subquery(不符合需求)
仅能筛选出存在至少一个非空filename图片的QuestionModel,无法精准匹配首图:
res = res.filter("SUBQUERY(media.images, $image, $image.name != '').@count > 0")
- Realm Swift Query API尝试(均报错)
第一种写法抛出NSException:Key paths that include a collection property must use aggregate operations
res = res.where { $0.media.images.name != "" }
第二种写法抛出NSException:Subqueries must contain a keypath starting with a collection.
res = res.where { ($0.media.images.name != "").count > 0 }
正确解决方案
Realm支持通过索引或first/last直接访问List的首尾元素,以此精准定位首图并判断条件:
写法一:显式判空(逻辑清晰)
res = res.where { // 依次确保media存在、images列表非空、首图filename非空且不是空字符串 $0.media != nil && $0.media!.images.count > 0 && $0.media!.images[0].filename != nil && $0.media!.images[0].filename! != "" }
写法二:可选链简化
利用可选链的特性自动处理空值情况,只有当所有环节都有效且首图filename非空时才匹配:
res = res.where { $0.media?.images.first?.filename != "" }
说明
Realm的Swift Query API支持对List使用索引(如[0])或first属性直接访问特定元素,这就能精准锁定第一个ImageModel,避免Subquery匹配所有元素的问题,完美满足需求。
内容的提问来源于stack exchange,提问作者Cuespeak
相关产品推荐
相关产品推荐

