首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Azure脱机同步:无法从__operations中删除操作

Azure脱机同步:无法从__operations中删除操作
EN

Stack Overflow用户
提问于 2018-09-04 20:13:16
回答 1查看 288关注 0票数 0

我有个大问题,我已经试了好几天了。在我的Xamarin项目中,我尝试处理插入冲突。问题是Cloud中的记录不存在,因为存在外键约束问题,因此我所处的场景中,同步冲突处理程序需要删除本地记录以及__operations表中的SQLite记录。我什么都试过了。将覆盖设置为“true”的情况下进行清除,以便删除本地记录和所有相关操作。不起作用。我一直试图通过手动访问SQL存储来强制删除它:

代码语言:javascript
复制
var id = localItem[MobileServiceSystemColumns.Id];
var operationQuery = await store.ExecuteQueryAsync("__operations", $"SELECT * FROM __operations WHERE itemId = '{id}'", null).ConfigureAwait(false);
var syncOperation = operationQuery.FirstOrDefault();
var tableName = operation.Table.TableName;

await store.DeleteAsync(tableName, new List<string>(){ id.ToString() });

if (syncOperation != null)
{
    await store.DeleteAsync("__operations", new List<string>() { syncOperation["id"].ToString() }).ConfigureAwait(false);
}

我能够查询__operations表,并且可以看到要删除的项的ID。DeleteAsync方法毫无例外地运行,但不返回任何状态,因此我不知道这是否有效。当我再次尝试同步时,操作就会顽固地存在。这听起来很荒谬。我如何删除一个操作而不必与web服务同步?我将进一步挖掘,并试图通过使用SQLiteRaw库来更努力地强制它,但我真的希望我错过了一些显而易见的东西?有人能帮忙吗?谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-05 06:21:22

您需要有一个Microsoft.WindowsAzure.MobileServices.Sync.MobileServiceSyncHandler类的子类,它覆盖OnPushCompleteAsync(),以处理冲突和其他错误。让我们调用类SyncHandler:

代码语言:javascript
复制
public class SyncHandler : MobileServiceSyncHandler
{
    public override async Task OnPushCompleteAsync(MobileServicePushCompletionResult result)
    {
        foreach (var error in result.Errors)
        {
            await ResolveConflictAsync(error);
        }
        await base.OnPushCompleteAsync(result);
    }

    private static async Task ResolveConflictAsync(MobileServiceTableOperationError error)
    {
        Debug.WriteLine($"Resolve Conflict for Item: {error.Item} vs serverItem: {error.Result}");

        var serverItem = error.Result;
        var localItem = error.Item;

        if (Equals(serverItem, localItem))
        {
            // Items are the same, so ignore the conflict
            await error.CancelAndUpdateItemAsync(serverItem);
        }
        else // check server item and local item or the error for criteria you care about
        {
            // Cancels the table operation and discards the local instance of the item.
            await error.CancelAndDiscardItemAsync();
        }
    }
}

在初始化SyncHandler()时,包括MobileServiceClient的一个实例:

代码语言:javascript
复制
        await MobileServiceClient.SyncContext.InitializeAsync(store, new SyncHandler()).ConfigureAwait(false);

阅读MobileServiceTableOperationError,查看您可以处理的其他冲突以及允许解决这些冲突的方法。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52173398

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档