我正在尝试用CloudKit上传一些记录更改。我正在使用CKModifyRecordsOperation来批量上传设备上已更改的记录。这些记录都在一个自定义区域中。
由于某些原因,操作不断返回,错误告诉我“保护数据不匹配”。
下面是代码:
- (void)updloadLocalChangesWithCompletionBlock:(void (^)(NSError *error))completionBlock
{
// Initialize the data
NSArray *localChanges = self.localChanges;
NSArray *localDeletions = self.localDeletions;
// Initialize the database and modify records operation
CKDatabase *database = [CKContainer defaultContainer].privateCloudDatabase;
CKModifyRecordsOperation *modifyRecordsOperation = [[CKModifyRecordsOperation alloc] initWithRecordsToSave:localChanges recordIDsToDelete:localDeletions];
modifyRecordsOperation.savePolicy = CKRecordSaveAllKeys;
NSLog(@"CLOUDKIT Changes Uploading: %d", localChanges.count);
// Add the completion block
modifyRecordsOperation.modifyRecordsCompletionBlock = ^(NSArray *savedRecords, NSArray *deletedRecordIDs, NSError *error) {
if (error) {
NSLog(@"[%@] Error pushing local data: %@", self.class, error);
}
[self.localChanges removeObjectsInArray:savedRecords];
[self.localDeletions removeObjectsInArray:deletedRecordIDs];
completionBlock(error);
};
// Start the operation
[database addOperation:modifyRecordsOperation];
}这是它给我的错误:
[CloudKitSyncManager] Error Uploading Changes: <CKError 0x156654a0: "Partial Failure" (2/1011); "Failed to modify some records"; partial errors: {
default-00001:(ZoneName:UserRecordID) = <CKError 0x1550b5a0: "Server Record Changed" (14/2037); "Error saving record <CKRecordID: 0x18080430; default-00001:(ZoneName:UserRecordID)> to server: Protection data didn't match">
}>发布于 2014-10-04 00:45:07
您的self.localChanges数组到底是什么?我想是CKRecord,但是您要上传的修改记录是基于从CloudKit下载的相同的CKRecord对象吗?
当我尝试用本地更改上传一个新分配的CKRecord并期望它覆盖服务器的副本时,我收到了类似的错误消息(虽然不是确切的)。我通过下载项目的远程副本,将更新应用到CloudKit提供给我的CloudKit实例,然后上传,从而修复了它。
发布于 2015-08-07 06:13:36
如果使用savePolicy of CKRecordSaveIfServerRecordUnchanged,则有必要在CKModifyRecordsOperation之前预取远程CKRecord (并更新该特定实例)。如果您分配一个“本地”CKRecord并通过CKRecordID使用匹配的initWithRecordName:对其进行向上引用,则CloudKit无法将远程更改标记与(缺失的)本地更改标记进行比较,因此它与CKErrorServerRecordChanged失败,并且出现了一些模糊的错误消息:“保护数据不匹配”。
但是,如果根本不存在远程CKRecord,那么服务器记录肯定没有改变,保存操作可以继续进行。这种行为是“如果不存在的话保存”用例的基础(SQL:在主键上插入)。如果您分配一个“本地”CKRecord并使用savePolicy of CKRecordSaveIfServerRecordUnchanged,它将插入,但从不更新。
如果您使用savePolicy of CKRecordSaveAllKeys和CKRecordZoneID ownerName of CKOwnerDefaultName,您应该能够通过“本地”分配的CKRecord保存(SQL: UPDATE,如果必要时使用INSERT ),通过网络保存一次(预取)行程。
“保存如果存在”用例(SQL:通过主键进行更新)可能在没有(验证)网络跳转的情况下无法完成。
陷阱:不可能将CKRecordSaveIfServerRecordUnchanged插入和CKRecordSaveAllKeys更新同时滚动到一个原子事务中,因为CloudKit事务跨多个CKRecord/CKRecordID实例只跨越一个CKModifyRecordsOperation。从哲学上讲,一个“事务”应该能够跨越多个“操作”(SQL: queries),而不仅仅是多个“记录”(SQL: rows)。
发布于 2014-09-17 07:25:31
我想,您应该为仪表板中相应的记录类型设置写权限。

https://stackoverflow.com/questions/25816117
复制相似问题