我使用 CloudKit 仪表板在 CloudKit 中创建了一条记录。该记录还包含照片的属性,我在保存记录之前上传了该属性。照片数据存储在CKAsset类型的属性中。在实体核心数据日期模型中,它表示为Data类型的属性。
当我稍后在与CloudKit同步的本地 sqlLite DB 上执行NSFetchRequest时,应该保存图像二进制数据的属性始终为零。所有其他属性(只是字符串)都填充了有效数据。当我更改这些属性并再次执行NSFetchRequest时,更改会反映在获取结果中。
我不知道为什么 photo 属性总是 nil 而其他字符串属性包含当前有效值。
编辑 - 提供示例代码。
这是从由 CloudKit 支持的本地 sqlite DB 获取它的代码,其中 photo 属性为nil,即使它在 CloudKit 中提供:
let bgContext = self.newBackgroundContext()
bgContext.perform {
do {
fetchRequest.propertiesToFetch = ["title", "categoryValue", "date", "photo", "amount"]
let results = try fetchRequest.execute() as! [ReceiptEntity]
for record in results {
let title = record.title
let photo = record.photo
if let photo_local = photo {
log.info("| Photo attribute is present!!")
}
}
}
} catch let error {
let result: Result<[ReceiptEntity], Error> = .failure(error)
cb(result)
}
这是 Xcode 生成的实体定义:
扩展 ReceiptEntity {
@nonobjc public class func fetchRequest() -> NSFetchRequest<ReceiptEntity> {
return NSFetchRequest<ReceiptEntity>(entityName: "ReceiptEntity")
}
@NSManaged public var additionalInformation: String?
@NSManaged public var amount: Double
@NSManaged public var categoryValue: String?
@NSManaged public var currencyValue: String?
@NSManaged public var date: Date?
@NSManaged public var placeMark: String?
@NSManaged public var title: String?
@NSManaged public var photo: Data?
}
如前所述:当我使用以下代码直接从 CloudKit 获取某个记录时 - photo 属性有一个 CKAsset 实例并且照片在那里:
privateDB.fetch(withRecordID: configRecordId) { (record, error) -> Void in
let photo = record?.value(forKey: "CD_photo") as? CKAsset
let title = record?.value(forKey: "CD_title") as? String
if let url = photo?.fileURL {
log.info("| Asset URL: \(url)")
}
}