You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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。

已尝试的方案

  1. 基础查询(需进一步筛选)
res = realm?.objects(QuestionModel.self)
  1. NSPredicate+Subquery(不符合需求)
    仅能筛选出存在至少一个非空filename图片的QuestionModel,无法精准匹配首图:
res = res.filter("SUBQUERY(media.images, $image, $image.name != '').@count > 0")
  1. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 12:23:25