CloudKit:"提供的区域ID与目标区域不匹配"。

5

I have this piece of code:

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)
}

我应该在Checks RecordZone中的Check对象上保存一个profile属性。当我触发此函数时,我收到以下错误:

 <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 ...

我尝试了几件事情:

  • 检查zoneID是否正确,结果是正确的。
  • 在该方法中将zoneID硬编码为CKRecordZoneID对象。
  • 在谷歌和SO上查找错误,但没有结果。

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

如何解决这个错误?任何建议都将不胜感激。

1个回答

6

您需要在操作中设置zoneID,例如:

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

更新:如下所述,.zoneID 仅在 CKQueryOperation 中可用,而不是 CKModifyRecordsOperation
我认为只有在同一区域中才能将 CKReference 设置为记录。如果不是这样的话,您可以尝试保存没有该引用的记录吗?
从文档中得知:
将每个自定义区域视为单独的数据单元,与数据库中的每个其他区域分开。在区域内,您可以像任何其他地方一样添加记录。您还可以使用 CKReference 类在区域内的记录之间创建链接。但是,CKReference 类不支持跨区域链接,因此每个引用对象必须指向与当前记录相同区域中的记录。
更新: 如果引用的源和目标都在默认区域中,则可以跨数据库(公共和私有)添加引用。

我试过了。实际上是这样的:CKRecordZoneID(zoneName: "Checks", ownerName: CKRecordZoneDefaultName)。虽然我很感激您的评论,但您还有其他想法吗? - Joris416
更新了问题,或许更加明确了一些。你必须考虑到我的sharedstore.checksID是一个NSString或者其他什么东西,但实际上它是一个合法的CKRecordZoneID对象。我知道它是合法的,因为我在所有的云操作中都使用它,并且它在其他地方都能够完美地工作,除了这个特定的函数。 - Joris416
好的,但是你仍然需要将其设置在操作上,而不仅仅是记录上。例如:operation.zoneID = sharedStore.checksID! - Edwin Vermeer
1
非常有道理,我明天一旦有电脑可用就试试看。 - Joris416
1
@EdwinVermeer,如果您能提到跨数据库(公共和私有)添加引用是可能的,只要引用的源和目标在默认区域内,那么这将有助于其他人。这是连接公共和私有记录的唯一方法。 - user1046037
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接