Azure 移动服务离线数据同步 - 提供的项目无效
Posted
技术标签:
【中文标题】Azure 移动服务离线数据同步 - 提供的项目无效【英文标题】:Azure Mobile Service Offline Data Sync - The item provided was not valid 【发布时间】:2015-08-21 20:12:48 【问题描述】:我使用 Azure 移动服务作为 ios 应用程序的后端。我已将所有内容设置为使用离线同步,即使没有网络连接,我也可以查看、添加或修改数据。我现在正在进行测试,当我尝试同步数据时遇到错误:“提供的项目无效”。
这是我正在做的事情:
我将一个新运动员添加到 syncTableWithName:@"Athlete" 中:
NSDictionary *newItem = @@"firstname": @"Charles", @"lastname": @"Lambert", @"laterality" : @"Orthodox";
[self.athletesService addItem:newItem completion:^
NSLog(@"New athlete added");
];
这里是 addItem 函数:
-(void)addItem:(NSDictionary *)item completion:(CompletionBlock)completion
// Insert the item into the Athlete table
[self.syncTable insert:item completion:^(NSDictionary *result, NSError *error)
[self logErrorIfNotNil:error];
// Let the caller know that we finished
dispatch_async(dispatch_get_main_queue(), ^
completion();
);
];
现在一切都很好,项目在同步表中。问题是当我尝试与 Azure 移动服务同步时。这是我正在调用的 syncData 函数:
-(void)syncData:(CompletionBlock)completion
// push all changes in the sync context, then pull new data
[self.client.syncContext pushWithCompletion:^(NSError *error)
[self logErrorIfNotNil:error];
[self pullData:completion];
];
pushWithCompletion 告诉我错误:“提供的项目无效。”之后调用的 pullData 函数也是如此:
-(void)pullData:(CompletionBlock)completion
MSQuery *query = [self.syncTable query];
// Pulls data from the remote server into the local table.
// We're pulling all items and filtering in the view
// query ID is used for incremental sync
[self.syncTable pullWithQuery:query queryId:@"allAthletes" completion:^(NSError *error)
[self logErrorIfNotNil:error];
// Let the caller know that we finished
dispatch_async(dispatch_get_main_queue(), ^
completion();
);
];
我试过直接在 MSTable 中插入,效果很好。当我使用 MSSyncTable 时,我确实遇到了这个错误。虽然当我在我的数据库中手动插入数据并同步我的上下文时,我可以获取数据并在我的 UITableView 中显示。
期待看到你们对此的看法。非常感谢!
感谢@phillipv,我刚刚编辑了我的问题。 当我像我一样使用 NSDictionary 添加项目时,我遇到了错误“提供的项目无效”。所以我尝试通过首先将它插入到我的 managedObjectContext 然后调用来添加一个项目:
NSDictionary *dict = [MSCoreDataStore tableItemFromManagedObject:newAthlete];
然后我在尝试同步时收到错误消息:“提供的项目没有有效的 ID。”
我觉得我正在经历一个循环.. :S
【问题讨论】:
这很有趣,错误意味着来自本地表的版本没有正确解析为 JSON。你的运动员表是如何在 CoreData 中定义的?能否添加一个 MSSyncContextDelegate 并实现 tableOperation:OnComplete,并记录 operation.item 以查看是否有任何不正确的地方? 我刚刚添加了我的运动员表描述@phillipv 这是@phillipv 询问的 operation.item 的输出: Operation item: aliasname = "@Charley14,您可以通过添加以下处理程序来解决该错误。
- (void)tableOperation:(nonnull MSTableOperation *)operation onComplete:(nonnull MSSyncItemBlock)completion
NSMutableDictionary *rwItem = [NSMutableDictionary dictionaryWithDictionary:operation.item];
// Temporary workaround
[rwItem removeObjectsForKeys:@[ @"relationship1", @"relationship2"]];
operation.item = rwItem;
[operation executeWithCompletion:completion];
tableOperation:onComplete: 处理程序只是删除与关系对应的键。您必须将代码 sn-p 中的“relationship1”、“relationship2”替换为应用程序中实际关系的名称。 修复错误 (https://github.com/Azure/azure-mobile-services/issues/779) 后,可以删除此解决方法。
【讨论】:
这确实暂时解决了我的问题。非常感谢!【参考方案2】:这似乎是 iOS SDK 中的一个错误,因为多对一关系不应该在 Push 调用期间提供给操作的对象中公开。
在 GitHub 上创建了以下带有更多详细信息的错误:https://github.com/Azure/azure-mobile-services/issues/779
错误消息的原因是由于关系是对象上的 NSSet,并且 NSJSONSerializer 抛出,因为它不知道如何将其转换为 JSON。
【讨论】:
你知道这个错误是否会很快得到纠正吗? @philipv以上是关于Azure 移动服务离线数据同步 - 提供的项目无效的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法对通过 Azure 移动服务同步更新的本地 Sqlite 做出反应?