我在Azure Offline Sync上做错了

时间:2018-02-16 15:27:26

标签: azure xamarin.forms azure-mobile-services

我认为我在Xamarin.form和Azure之间的离线更新方面做错了。 我使用Microsoft.Azure.Mobile.Client 4.0.2。所有初始同步工作都很好。我遇到的问题是当我尝试在本地更新项目然后同步到服务器。对于我的测试,我更改Appel(法语程序;-))对象的Statut字段然后调用UpadteAsync(本地更新)然后我调用主syncAppelsAsync(远程更新)

public async Task UpdateAppelAsync(Appel appel)
{
  await _appelsTable.UpdateAsync(appel);            
  await SyncAppelsAsync();                
}

然后主要SyncAppelsAsync:

public async Task SyncAppelsAsync()
{
    await _authenticationService.SingIn();  


    ReadOnlyCollection<MobileServiceTableOperationError> syncErrors = null;

    try
    {
        await _appelsTable.PullAsync("allAppels", _appelsTable.CreateQuery());
    }
    catch (MobileServicePushFailedException exc)
    {
        if (exc.PushResult != null)
        {
            syncErrors = exc.PushResult.Errors;
        }
    }

    //Simple error/ conflict handling.
    bool reSync = false;
    if (syncErrors != null)
    {
        foreach (var error in syncErrors)
        {
            if (error.OperationKind == MobileServiceTableOperationKind.Update && error.Result != null)
            {
                StringBuilder message = new StringBuilder("Champs en problème: Local VS Server" + Environment.NewLine);
                List<SyncConflic> conflits = JSonCompare.FindConflicObjects(error.Item, error.Result);
                foreach (SyncConflic conflit in conflits)
                {
                    if (conflit.key != "id" && conflit.key != "version" && conflit.key != "updatedAt" & conflit.key != "createdAt")
                    {
                        switch (conflit.key)
                        {
                            case "statutId":
                                Statut StatLoc = await this.GetStatutByIdAsync(conflit.local);
                                Statut StatRem = await this.GetStatutByIdAsync(conflit.remote);
                                message.Append(conflit.key + ":" + StatLoc.nom + " <> " + StatRem.nom + Environment.NewLine);
                                break;
                            default:
                                message.Append(conflit.key + ":" + conflit.local + " <> " + conflit.remote + Environment.NewLine);
                                break;
                        }

                    }
                }

                message.Append("Quelle version voulez-vous conserver?" + Environment.NewLine);
                if(await _extDialogService.ShowMessage(message.ToString(),"Conflit de MAJ d'un Appel", "Serveur", "Local",null))
                {
                    // Revert to server's copy
                    await error.CancelAndUpdateItemAsync(error.Result);
                }
                else
                {
                    // Force local item to server
                    error.Item["version"] = error.Result["version"];
                    await error.UpdateOperationAsync(error.Item);
                    reSync = true;
                }



            }
            else
            {
                // Discard local change
                await error.CancelAndDiscardItemAsync();
                ErrorHandling.LogError("Error executing sync operation. Item: " + error.TableName + " (" + error.Item["id"] + "). Operation discarded.");
            }


        }
    }
    if(reSync)
    {
        await SyncAppelsAsync();
    }
}

当我调用SyncAppelsAsync时,PullAsync将根据需要执行推送。我遇到的问题是:

  1. 更改Appel Statut字段
  2. 调用UpdateAPpelAsync(在IOS DB中本地保存OK)
  3. 调用SyncAppelsAsync(远程Azure SQL更改确定)
  4. 再次更改法规字段
  5. 调用UpdateAPpelAsync(在IOS DB中本地保存OK)
  6. 调用SyncAppelsAsync - &gt;检测到冲突,因此我的冲突解决开始并要求我在服务器或本地数据之间进行选择。为什么在Version和Statut字段中检测到冲突? 2更新是从IOS客户端进行的,而没有任何其他系统在Azure SQL上更改它...
  7. 要在没有冲突的情况下进行更新,我需要:

    1. 更改Appel Statut字段
    2. 调用UpdateAPpelAsync(在IOS DB中本地保存OK)
    3. 调用SyncAppelsAsync(远程Azure SQL更改确定)
    4. 再次调用SyncAppelsAsync(我在列表视图中执行此操作并提示刷新)
    5. 再次更改法规字段
    6. 调用UpdateAPpelAsync(在IOS DB中本地保存OK)
    7. 调用SyncAppelsAsync(无冲突,更新成功)
    8. 我做错了什么?

      EDIT2 ------ 我发现2个PATCH操作之间的版本#很奇怪

      1. 使用PullAsync()更新项目并首次同步后。我看到PATCH操作发送版本为AAAAAJyU =的修改项目(我们在标题缓存指令中看到版本号If-Match =“AAAAAJyU =”)
      2. 然后GET(pullAsync的第二部分)启动并返回具有新版本的对象#AAAAAJyg =
      3. 当我进行第二次更新时,PullAsync()会发送正确的修改项(我可以看到JSON中的更改),但在If-Match指令中,将发送旧的AAAAAJyU版本号。所以服务器期望接收AAAAAJyg =返回HTTP / 1.1 412 Precondition Failed。
      4. 所以有些东西不会在localDB中回写。在PullAsync完成后......

0 个答案:

没有答案