Azure 移动服务离线数据同步 - 提供的项目无效
Azure Mobile Service Offline Data Sync - The item provided was not valid
我正在使用 Azure 移动服务作为 iOS 应用程序的后端。我已将所有内容设置为使用离线同步,即使没有网络连接,我也可以查看、添加或修改数据。我现在正在进行测试,当我尝试同步数据时 运行 出现错误:"The item provided was not valid"。
这是我正在做的事情:
我将新运动员添加到 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();
});
}];
}
目前一切正常,项目在 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 给我错误:"The item provided was not valid." 之后调用的 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 添加项目时,我 运行 进入了错误 "The item provided was not valid"。所以我尝试通过首先将它插入到我的 managedObjectContext 然后调用来添加一个项目:
NSDictionary *dict = [MSCoreDataStore tableItemFromManagedObject:newAthlete];
然后我在尝试同步时收到错误消息:"The item provided did not have a valid id."
感觉自己在经历一个圈子..:S
这似乎是 iOS SDK 中的错误,因为多对一关系不应在推送调用期间在提供给操作的对象中公开。
创建了以下错误,其中包含有关 GitHub 的更多详细信息:https://github.com/Azure/azure-mobile-services/issues/779
错误消息的原因是由于关系是对象上的 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: 处理程序只是删除与关系对应的键。您必须将代码片段中的 'relationship1'、'relationship2' 替换为应用程序中实际关系的名称。
错误 (https://github.com/Azure/azure-mobile-services/issues/779) 修复后,可以删除此解决方法。
我正在使用 Azure 移动服务作为 iOS 应用程序的后端。我已将所有内容设置为使用离线同步,即使没有网络连接,我也可以查看、添加或修改数据。我现在正在进行测试,当我尝试同步数据时 运行 出现错误:"The item provided was not valid"。
这是我正在做的事情:
我将新运动员添加到 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();
});
}];
}
目前一切正常,项目在 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 给我错误:"The item provided was not valid." 之后调用的 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 添加项目时,我 运行 进入了错误 "The item provided was not valid"。所以我尝试通过首先将它插入到我的 managedObjectContext 然后调用来添加一个项目:
NSDictionary *dict = [MSCoreDataStore tableItemFromManagedObject:newAthlete];
然后我在尝试同步时收到错误消息:"The item provided did not have a valid id."
感觉自己在经历一个圈子..:S
这似乎是 iOS SDK 中的错误,因为多对一关系不应在推送调用期间在提供给操作的对象中公开。
创建了以下错误,其中包含有关 GitHub 的更多详细信息:https://github.com/Azure/azure-mobile-services/issues/779
错误消息的原因是由于关系是对象上的 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: 处理程序只是删除与关系对应的键。您必须将代码片段中的 'relationship1'、'relationship2' 替换为应用程序中实际关系的名称。 错误 (https://github.com/Azure/azure-mobile-services/issues/779) 修复后,可以删除此解决方法。