使用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
相关产品推荐
相关产品推荐

