首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CloudKit CKModifyRecordsOperation给了我一个“保护数据不匹配”

CloudKit CKModifyRecordsOperation给了我一个“保护数据不匹配”
EN

Stack Overflow用户
提问于 2014-09-12 20:12:08
回答 4查看 4.4K关注 0票数 8

我正在尝试用CloudKit上传一些记录更改。我正在使用CKModifyRecordsOperation来批量上传设备上已更改的记录。这些记录都在一个自定义区域中。

由于某些原因,操作不断返回,错误告诉我“保护数据不匹配”。

下面是代码:

代码语言:javascript
复制
- (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];
}

这是它给我的错误:

代码语言:javascript
复制
[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">
}>
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-10-04 00:45:07

您的self.localChanges数组到底是什么?我想是CKRecord,但是您要上传的修改记录是基于从CloudKit下载的相同的CKRecord对象吗?

当我尝试用本地更改上传一个新分配的CKRecord并期望它覆盖服务器的副本时,我收到了类似的错误消息(虽然不是确切的)。我通过下载项目的远程副本,将更新应用到CloudKit提供给我的CloudKit实例,然后上传,从而修复了它。

票数 6
EN

Stack Overflow用户

发布于 2015-08-07 06:13:36

如果使用savePolicy of CKRecordSaveIfServerRecordUnchanged,则有必要在CKModifyRecordsOperation之前预取远程CKRecord (并更新该特定实例)。如果您分配一个“本地”CKRecord并通过CKRecordID使用匹配的initWithRecordName:对其进行向上引用,则CloudKit无法将远程更改标记与(缺失的)本地更改标记进行比较,因此它与CKErrorServerRecordChanged失败,并且出现了一些模糊的错误消息:“保护数据不匹配”。

但是,如果根本不存在远程CKRecord,那么服务器记录肯定没有改变,保存操作可以继续进行。这种行为是“如果不存在的话保存”用例的基础(SQL:在主键上插入)。如果您分配一个“本地”CKRecord并使用savePolicy of CKRecordSaveIfServerRecordUnchanged,它将插入,但从不更新。

如果您使用savePolicy of CKRecordSaveAllKeysCKRecordZoneID ownerName of CKOwnerDefaultName,您应该能够通过“本地”分配的CKRecord保存(SQL: UPDATE,如果必要时使用INSERT ),通过网络保存一次(预取)行程。

“保存如果存在”用例(SQL:通过主键进行更新)可能在没有(验证)网络跳转的情况下无法完成。

陷阱:不可能将CKRecordSaveIfServerRecordUnchanged插入和CKRecordSaveAllKeys更新同时滚动到一个原子事务中,因为CloudKit事务跨多个CKRecord/CKRecordID实例只跨越一个CKModifyRecordsOperation。从哲学上讲,一个“事务”应该能够跨越多个“操作”(SQL: queries),而不仅仅是多个“记录”(SQL: rows)。

票数 7
EN

Stack Overflow用户

发布于 2014-09-17 07:25:31

我想,您应该为仪表板中相应的记录类型设置写权限。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25816117

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档