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

时间:2018-09-04 20:13:17

标签: azure-mobile-services

我遇到了一个巨大的问题,我已经尝试了好几天才能解决。我有一种情况,我试图处理Xamarin项目中的插入冲突。问题在于Cloud DB中的记录不存在,因为存在外键约束问题,因此我处于一种情况,其中同步冲突处理程序需要删除本地记录以及__operations中的记录SQLite中的表格。我已经尝试过一切。使用替代设置为“ true”进行清除,以便它应该删除本地记录和所有关联的操作。不起作用我一直试图通过手动访问SQL存储来强制删除它:

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库来使其更加困难,但我真的很希望我缺少明显的东西吗?有人可以帮忙吗?谢谢!

1 个答案:

答案 0 :(得分:2)

您需要具有Microsoft.WindowsAzure.MobileServices.Sync.MobileServiceSyncHandlerHandler类的子类,该类重写OnPushCompleteAsync()以便处理冲突和其他错误。我们将其称为SyncHandler类:

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();
        }
    }
}

在初始化MobileServiceClient时包括此SyncHandler()的实例:

        await MobileServiceClient.SyncContext.InitializeAsync(store, new SyncHandler()).ConfigureAwait(false);

继续阅读MobileServiceTableOperationError,了解您可以处理的其他冲突以及解决冲突的方法。