Cloudkit:"提供的ZoneId与目标区域"

时间:2015-10-21 10:49:20

标签: ios swift cloud icloud 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)
}

它应该在profile RecordZone中的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 ...

}&GT;

我尝试了几件事:

  • 检查zoneID是否实际正确,它是什么。
  • 将zoneID硬编码为方法中的CKRecordZoneID对象。
  • 在google和SO上查找错误,但没有结果。

请注意,sharedstore.checksID是一个实际ID,而不是字符串,这是在提取所有记录区域时在应用启动时创建的。

我怎样才能解决这个错误?任何建议都将受到高度赞赏。

1 个答案:

答案 0 :(得分:6)

你必须在操作上设置zoneID,如:

    operation.zoneID = CKRecordZoneID(zoneName: sharedStore.checksID!, ownerName: "your name")

更新:如下所述,.zoneID仅适用于CKQqueryOperation而不是CKModifyRecordsOperation

我认为只能将CKReference设置为同一区域中的记录。是这样的吗?如果没有,那么你可以尝试保存没有该引用的记录吗?

来自文档:

  

将每个自定义区域视为与其分开的单个数据单元   数据库中的每个其他区域。在区域内,您将记录添加为   你会在其他地方。您还可以在记录之间创建链接   使用CKReference类在区域内。但是,CKReference   class不支持跨区链接,因此每个引用对象   必须指向与当前记录相同的区域中的记录

<强>更新 如果引用的源和目标位于默认区域,则可以跨数据库(公共和私有)添加引用。