使用CKAsset在CloudKit中创建了记录,但获取时资产始终为零,其他属性也可以



我使用CloudKit Dashboard在CloudKit中创建一个记录。该记录还包含照片的属性,我在保存该记录之前将其上传。照片数据存储在类型为CKAsset的属性中。在实体核心数据日期模型中,它被表示为data类型的属性。

当我稍后在与CloudKit同步的本地sqlLite DB上执行NSFetchRequest时,应该保存映像的二进制数据的属性始终为零。所有其他属性(只是字符串(都填充了有效的数据。当我更改这些属性并再次执行NSFetchRequest时,这些更改将反映在提取结果中。

我不知道为什么照片属性总是为零,而其他字符串属性包含当前有效值。

EDIT-提供了示例代码。

这是从CloudKit支持的本地sqlite DB中获取照片的代码,其中照片属性为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获取某个记录时,照片属性有一个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)")
}
}

我终于发现了问题。在扩展数据模型的迭代过程中,我使用CK面板在CloudKit中手动添加了属性,并将这些属性添加到我的数据模型中。

通过将CKAsset属性添加到名为CD_photo的CK。但这是错误的。照片属性应该具有类型";字节";然后是ckAsset类型的另一个名为CD_ photo_。

但最简单的方法是让NSPersistentCloudKitContainer为您创建应用程序的架构。

相关内容

最新更新