Ios 使用CKAsset在CloudKit中创建了记录,但在获取时该资产始终为零,其他属性都正常

Ios 使用CKAsset在CloudKit中创建了记录,但在获取时该资产始终为零,其他属性都正常,ios,core-data,cloudkit,ckasset,Ios,Core Data,Cloudkit,Ckasset,我使用CloudKit仪表板在CloudKit中创建记录。该记录还包含照片的属性,我在保存记录之前上载了该属性。 照片数据存储在类型为CKAsset的属性中。 在实体核心数据日期模型中,它表示为数据类型的属性 当我稍后在与CloudKit同步的本地sqlLite DB上执行NSFetchRequest时,应该保存图像二进制数据的属性始终为零。 所有其他属性(仅为字符串)都由有效数据填充。当我更改这些属性并再次执行NSFetchRequest时,更改将反映在获取结果中 我不知道为什么photo属性

我使用CloudKit仪表板在CloudKit中创建记录。该记录还包含照片的属性,我在保存记录之前上载了该属性。 照片数据存储在类型为CKAsset的属性中。 在实体核心数据日期模型中,它表示为数据类型的属性

当我稍后在与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)
            }

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

通过向CK添加一个名为CD_photo的CKAsset属性。但这是错误的。photo属性的类型应为“Bytes”,然后是另一个名为CD_photo_ckAsset的属性,类型为ckAsset


但最简单的方法是通过为您创建应用程序的架构,让NSPersistentCloudKitContainer正常运行。

当我使用privateDB.fetch(withRecordID:…)直接从CloudKit获取记录时,我获得了CKAsset,但当我使用NSFetchRequest.execute(…)获取记录时,它为零。数据模型中照片属性的类型为data?类型。核心数据模型中是否有data属性?如果没有,您应该在模型中创建此字段。您好!是的,我有一个名为“photo”的数据类型属性?在我的模型中。我使用Xcode-Modelbuilder创建了它。好的,cloudkit仪表板中属性CD_照片的名称是什么?您可以提供如何保存照片的示例代码吗?可以-照片的属性在CloudKit仪表板中称为CD_photo,类型为CKAsset。有关代码示例,请参阅编辑后的原始帖子。
@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?
    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)")
        }

    }