Ios Azure移动服务脱机数据同步-提供的项目无效
我正在使用Azure移动服务作为iOS应用程序的后端。我已将所有内容设置为脱机同步,即使没有网络连接,也可以通过脱机同步查看、添加或修改数据。我现在正在进行测试,在尝试同步数据时遇到错误:“提供的项无效” 以下是我正在做的: 我向SyncTable中添加了一个新运动员,其名称为:@“运动员”,并带有以下内容:Ios Azure移动服务脱机数据同步-提供的项目无效,ios,objective-c,azure,core-data,azure-mobile-services,Ios,Objective C,Azure,Core Data,Azure Mobile Services,我正在使用Azure移动服务作为iOS应用程序的后端。我已将所有内容设置为脱机同步,即使没有网络连接,也可以通过脱机同步查看、添加或修改数据。我现在正在进行测试,在尝试同步数据时遇到错误:“提供的项无效” 以下是我正在做的: 我向SyncTable中添加了一个新运动员,其名称为:@“运动员”,并带有以下内容: NSDictionary *newItem = @{@"firstname": @"Charles", @"lastname": @"Lambert", @"laterality" : @
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];
}];
}
NSDictionary *dict = [MSCoreDataStore tableItemFromManagedObject:newAthlete];
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,然后调用:
-(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];
}];
}
NSDictionary *dict = [MSCoreDataStore tableItemFromManagedObject:newAthlete];
然后,当我尝试同步时出现错误:“提供的项目没有有效的id。”
我觉得我正在经历一个循环S这似乎是iOS SDK中的一个bug,因为在推送调用期间,多对一关系不应该在给定给操作的对象中公开 在GitHub上创建了以下bug,并提供了更多详细信息:
错误消息的原因是,该关系是对象上的NSSet,并且NSJSONSerializer抛出,因为它不知道如何将其转换为JSON。这似乎是iOS SDK中的一个错误,因为在Push调用期间,多对一关系不应该在给定给操作的对象中公开 在GitHub上创建了以下bug,并提供了更多详细信息:
错误消息的原因是,该关系是对象上的NSSet,并且NSJSONSerializer抛出,因为它不知道如何将其转换为JSON。@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:handler只是删除对应于关系的键。您必须将代码段中的“relationship1”、“relationship2”替换为应用程序中实际关系的名称。
修复bug()后,可以删除此解决方法。@Charley14,您可以通过添加以下处理程序来解决此bug
- (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:handler只是删除对应于关系的键。您必须将代码段中的“relationship1”、“relationship2”替换为应用程序中实际关系的名称。
一旦bug()被修复,这个解决方法就可以被删除。有趣的是,这个错误意味着来自本地表的版本没有正确解析为JSON。如何在CoreData中定义运动员表?你能添加一个MSSyncContextDelegate并实现tableOperation:OnComplete,并记录操作。item以查看obv是否有任何不正确的地方吗?我刚刚添加了我的运动员表描述@phillipvHere's这是操作的输出。item作为@phillipv:operation item的要求:{aliasname=“”;birthdate=“”;firstname=N;height=0;id=“AD76405C-6A3D-4FE7-98D9-C3299326AAC9”;姓氏=B;偏侧性=正统;国籍=”;范围=0;性别=0;争吵=”{(\n)};体重=0;}显然,firstname、lastname和laterality不是作为字符串输出的。我只是不知道为什么。有趣的是,这个错误意味着从本地表生成的版本没有正确解析为JSON。运动员表在CoreData中是如何定义的?能否添加MSSyncContextDelegate并实现tableOperation:OnComplete和logoperation.item查看obv是否有任何错误?我刚刚添加了我的运动员表描述@phillipvHere是operation.item的输出@phillipv:operation item:{aliasname=“”;birthdate=“”;firstname=N;height=0;id=“AD76405C-6A3D-4FE7-98D9-C3299326AAC9”;lastname=B;偏侧性=正统;国籍=”“reach=0;sex=0;sparrings=“{(\n)}”;weight=0;}显然,firstname、lastname和laterality不作为字符串输出。我只是不知道为什么。你知道这个错误会很快被纠正吗@Philip你知道这个错误是否会很快被纠正吗@这确实暂时解决了我的问题。非常感谢你!这确实暂时解决了我的问题。非常感谢你!