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

使用Core Data Transformable属性,如何用NSPredicate判断集合非空?

筛选CoreData中viewingDates集合非空的Item实体

因为viewingDates是Transformable类型属性,CoreData无法直接解析其内部的集合结构,所以不能直接通过viewingDates.isEmpty这类条件编写NSPredicate。针对15000+条数据的场景,推荐以下高效方案:

方案一:添加辅助Bool属性(推荐,性能最优)

给Item实体新增一个Bool类型的属性hasViewingDates,用来标记viewingDates是否为空:

@NSManaged public var hasViewingDates: Bool

之后在Item类中维护这个属性的同步更新,比如重写willSave方法:

override func willSave() {
    super.willSave()
    // 每次保存前同步更新标记
    hasViewingDates = !viewingDates.isEmpty
}

这样查询时可以直接用高效的Predicate,还能给hasViewingDates添加索引进一步提升速度:

let predicate = NSPredicate(format: "hasViewingDates == %@", NSNumber(value: true))
let fetchRequest: NSFetchRequest<Item> = Item.fetchRequest()
fetchRequest.predicate = predicate

方案二:利用Transformable的二进制存储特性(不推荐,兼容性差)

Transformable属性最终会被序列化为NSData存储,非空集合的序列化数据长度大于0,理论上可以用以下Predicate:

let predicate = NSPredicate(format: "viewingDates != nil AND viewingDates.data.length > 0")

但这个方法依赖序列化后的具体数据格式,一旦序列化方式改变(比如修改Transformable的transformer)就会失效,且无法利用索引,性能远不如方案一。

内容的提问来源于stack exchange,提问作者parapote

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 23:15:46