Ios Azure移动服务脱机数据同步-提供的项目无效

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" : @

我正在使用Azure移动服务作为iOS应用程序的后端。我已将所有内容设置为脱机同步,即使没有网络连接,也可以通过脱机同步查看、添加或修改数据。我现在正在进行测试,在尝试同步数据时遇到错误:“提供的项无效”

以下是我正在做的:

我向SyncTable中添加了一个新运动员,其名称为:@“运动员”,并带有以下内容:

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你知道这个错误是否会很快被纠正吗@这确实暂时解决了我的问题。非常感谢你!这确实暂时解决了我的问题。非常感谢你!