Azure 移动服务离线数据同步 - 提供的项目无效

Posted

技术标签:

【中文标题】Azure 移动服务离线数据同步 - 提供的项目无效【英文标题】:Azure Mobile Service Offline Data Sync - The item provided was not valid 【发布时间】:2015-08-21 20:12:48 【问题描述】:

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

这是我正在做的事情:

我将一个新运动员添加到 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();
         );
     ];

现在一切都很好,项目在同步表中。问题是当我尝试与 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

【问题讨论】:

这很有趣,错误意味着来自本地表的版本没有正确解析为 JSON。你的运动员表是如何在 CoreData 中定义的?能否添加一个 MSSyncContextDelegate 并实现 tableOperation:OnComplete,并记录 operation.item 以查看是否有任何不正确的地方? 我刚刚添加了我的运动员表描述@phillipv 这是@phillipv 询问的 operation.item 的输出: Operation item: aliasname = "";生日 = "";名字 = N;高度 = 0; id = "AD76405C-6A3D-4FE7-98D9-C3299326AAC9";姓氏 = B;偏侧性=正统;国籍 = "";到达 = 0;性别 = 0;陪练 = "(\n)";重量 = 0;显然 firstname、lastname 和laterality 不是作为字符串输出的。我只是不知道为什么。 【参考方案1】:

@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: 处理程序只是删除与关系对应的键。您必须将代码 sn-p 中的“relationship1”、“relationship2”替换为应用程序中实际关系的名称。 修复错误 (https://github.com/Azure/azure-mobile-services/issues/779) 后,可以删除此解决方法。

【讨论】:

这确实暂时解决了我的问题。非常感谢!【参考方案2】:

这似乎是 iOS SDK 中的一个错误,因为多对一关系不应该在 Push 调用期间提供给操作的对象中公开。

在 GitHub 上创建了以下带有更多详细信息的错误:https://github.com/Azure/azure-mobile-services/issues/779

错误消息的原因是由于关系是对象上的 NSSet,并且 NSJSONSerializer 抛出,因为它不知道如何将其转换为 JSON。

【讨论】:

你知道这个错误是否会很快得到纠正吗? @philipv

以上是关于Azure 移动服务离线数据同步 - 提供的项目无效的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法对通过 Azure 移动服务同步更新的本地 Sqlite 做出反应?

Azure 移动服务 PullAsync() 未填充同步表

多表离线同步 Xamarin.Forms & Azure

将 Azure 移动应用服务与现有 SQL 数据库一起使用

Azure DevOps Server(TFS): 在Excel中解除服务器同步

Azure 移动服务:无数据选项卡