假设我有一个带有属性systemFields
的托管对象,其中CKRecord系统字段被编码。
如何使用我从订阅通知中获得的CKRecord
查询以前保存的实体的效率如何?
是否可以为NSFetchRequest
设置谓词以查询现有CoreData实体by CKRecord
?
class FailureCDEntity: NSManagedObject {
@NSManaged private (set) var summaryDescription: String
@NSManaged private (set) var creationDate: Date
@NSManaged private (set) var systemFields: Data
convenience init(record: CKRecord, in context: NSManagedObjectContext) throws {
try self.init(in: context)
systemFields = record.encode()
...
}
}
CKRecord的扩展名:
extension CKRecord {
func encode() -> Data {
let data = NSMutableData()
let archiver = NSKeyedArchiver(forWritingWith: data)
archiver.requiresSecureCoding = true
encodeSystemFields(with: archiver)
archiver.finishEncoding()
return data as Data
}
}
答案 0 :(得分:0)
二进制字段的谓词与其他类型的字段具有相同的限制,但二元性质使得它们更难构造。如果您确定encode()
方法会为存储对象和通知中的结果生成完全相同的结果,则可以使用与{的值匹配的普通谓词{1}}。如果没有,您唯一的选择取决于知道二进制编码的细节。你能用“开头”谓词吗?也许是“以...结尾”?如果不知道如何根据二进制表示的子集匹配值,就不可能说。
由于这个原因,依赖于二进制字段的谓词很难或不可能使用。如果您可以描述如何根据二进制编码匹配值,您可能会想出一个谓词来实现它。否则,将需要一些其他技术。我对systemFields
不够熟悉,不知道那是什么。也许存储记录ID并匹配?