我使用Azure移动服务作为iOS应用的后端。我设置了所有可以使用离线同步的功能,即使没有网络连接,也可以查看,添加或修改数据。我现在正在测试,我遇到了一个错误:"提供的项目无效"当我尝试同步数据时。
这就是我正在做的事情:
我在syncTableWithName中添加了一名新运动员:@"运动员"有了这个:
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();
});
}];
}
现在一切都很好,项目在syncTable中。问题是当我尝试与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
答案 0 :(得分:2)
这似乎是iOS SDK中的一个错误,因为在Push呼叫期间,不应该在给予操作的对象中公开多对一关系。
创建了以下错误,其中包含有关GitHub的更多详细信息:https://github.com/Azure/azure-mobile-services/issues/779
错误消息的原因是由于关系是对象上的NSSet,并且NSJSONSerializer因为不知道如何将其转换为JSON而抛出。