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) 修复后,可以删除此解决方法。