IMobileServiceSyncHandler - 覆盖本地版本

时间:2017-03-01 16:06:21

标签: c# azure xamarin azure-web-sites azure-mobile-services

我实现了一个IMobileServiceSyncHandler。我的目标是实现一个"服务器永远赢得机制"。因此,当检测到冲突时,IMobileServiceSyncHandler应使用服务器副本覆盖本地副本。

这是我的代码:

main

相关部分是:

 class MySyncHandler : IMobileServiceSyncHandler
    {
        public IMobileServiceSyncTable<Error> localTable;
        IMobileServiceClient client;

        public MySyncHandler(IMobileServiceClient client)
        {
            this.client = client;
        }

        public async Task<JObject> ExecuteTableOperationAsync(IMobileServiceTableOperation operation)
        {
            JObject result = null;
            MobileServicePreconditionFailedException conflictError = null;
            do
            {
                try
                {
                    result = await operation.ExecuteAsync();
                }
                catch (MobileServicePreconditionFailedException e)
                {
                    conflictError = e;


                }

                if (conflictError != null)
                {
                    JObject serverItem = conflictError.Value;

                    if (serverItem == null)
                    {
                        serverItem = (JObject)(await operation.Table.LookupAsync((string)operation.Item[MobileServiceSystemColumns.Id]));
                    }

                    await localTable.UpdateAsync(serverItem);

                }
            } while (conflictError != null);

            return result;
        }

        public Task OnPushCompleteAsync(MobileServicePushCompletionResult result)
        {
            return Task.FromResult(0);
        }
    }

我的想法是使用服务器版本更新本地表。

我的问题:

这不起作用。本地副本不会更改。它仍然是本地版本。

你能帮忙吗?

1 个答案:

答案 0 :(得分:1)

同一位工程师在这里有一个更完整的例子:Azure Mobile Services - Handling Conflicts with Offline

为了保留记录的服务器版本,请替换此行:

await localTable.UpdateAsync(serverItem);

return serverItem;
当发生冲突时,在if区块内