Jor*_*416 5 cloud ios icloud swift cloudkit
我有这段代码:
func saveProfileForCheck(check: Check) {
let toSave = CKRecord(recordType: "Check", zoneID: sharedStore.checksID!)
let profile = check.profile as Profile!
toSave.setValue(NSString(format: "%i", check.closed), forKey: "closed")
toSave.setValue(check.date, forKey: "date")
toSave.setValue(NSString(format: "%i", check.paid), forKey: "paid")
toSave.setValue(CKReference(recordID: profile.dbRecordID, action: CKReferenceAction.DeleteSelf), forKey: "profile")
let operation = CKModifyRecordsOperation(recordsToSave: [toSave], recordIDsToDelete: [check.id])
operation.modifyRecordsCompletionBlock = { (savedRecords, deletedRecordIDs, error) in
if error != nil {
self.delegate?.cloudKitReturnedError(error!)
} else {
self.modifiedCheck(check, newRecord: savedRecords![0] as CKRecord )
}
}
privateDB.addOperation(operation)
}
Run Code Online (Sandbox Code Playgroud)
它应该在我的RecordZone中profile的Check对象上保存属性Checks.当我触发此功能时,我收到此错误:
<CKError 0x7f8c2046d630: "Partial Failure" (2/1011); "Failed to modify some records"; uuid = EF4CCE3F-3CDB-4506-BA43-464D7D9BD0F6; container ID = "mycontainer"; partial errors: {
130BD962-295C-4601-9343-2E4F4014C8C7:(Checks:__defaultOwner__) = <CKError 0x7f8c2045c680: "Invalid Arguments" (12/2006); server message = "ZoneId provided doesn't match target zone">
... 1 "Batch Request Failed" CKError's omited ...
Run Code Online (Sandbox Code Playgroud)
}>
我尝试了几件事:
请注意,这sharedstore.checksID是一个实际的ID而不是字符串,它是在获取所有记录区域时在应用程序启动时创建的.
我怎么能解决这个错误?任何建议都将受到高度赞赏.
你必须在操作上设置zoneID,如:
operation.zoneID = CKRecordZoneID(zoneName: sharedStore.checksID!, ownerName: "your name")
Run Code Online (Sandbox Code Playgroud)
更新:如下所述.zoneID,仅在a CKQqueryOperation而不是a上提供CKModifyRecordsOperation
我相信只能将CKReference设置为同一区域中的记录.是这样的吗?如果没有,那么你可以尝试保存没有该引用的记录吗?
从文档:
将每个自定义区域视为与数据库中每个其他区域分开的单个数据单元.在区域内,您可以像在其他任何地方一样添加记录.您还可以使用CKReference类在区域内的记录之间创建链接.但是,CKReference类不支持跨区域链接,因此每个引用对象必须指向与当前记录相同的区域中的记录
更新: 如果引用的源和目标位于默认区域中,则可以跨数据库(公共和私有)添加引用.
| 归档时间: |
|
| 查看次数: |
400 次 |
| 最近记录: |