c# - Azure移动服务: Define a Table only locally

标签 c# azure xamarin azure-mobile-services

我在 Xamarin 应用中使用离线同步。我有以下情况:

我有几个可以正常同步的表,还有一个名为 LocalOnlyTable 的表,我不想同步。我只想在本地读/写它。

当我像这样拉一张表时,就会出现问题:

await exerciseTable.PullAsync(string.Format("{0}ItemByFK", typeof(Exercise).Name), exerciseTable.CreateQuery());

我收到一个 MobileServicePushFailedException 消息,提示 404 LocalOnlyTable 不存在

我想知道为什么移动服务尝试推/拉 LocalOnlyTable 和 如何阻止移动服务尝试同步 LocalOnlyTable

最佳答案

刚刚在这里遇到您的问题,并想分享我的解决方案。

1) 创建自定义 TableSyncHandler 以阻止仅限本地的表:

public class TableSyncHandler : IMobileServiceSyncHandler
{
    private readonly IMobileServiceClient _client;
    private readonly HashSet<string> _excludedTables = new HashSet<string>();

    public TableSyncHandler(IMobileServiceClient client)
    {
        _client = client;
    }

    public void Exclude<T>()
    {
        _excludedTables.Add(_client.SerializerSettings.ContractResolver.ResolveTableName(typeof(T)));
    }

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

    public Task<JObject> ExecuteTableOperationAsync(IMobileServiceTableOperation operation)
    {
        if (_excludedTables.Contains(operation.Table.TableName))
        {
            return Task.FromResult((JObject) null);
        }
        return operation.ExecuteAsync();
    }
}

2)当你初始化MobileServiceClient的SyncContext时,将你想要排除的表注册到这个syncHandler中,然后使用syncHandler初始化SyncContext:

_store = new MobileServiceSQLiteStore("YourStore");
_store.DefineTable<User>();
_store.DefineTable<LocalOnlyTable>();

_syncHandler = new TableSyncHandler(client);

// LocalOnlyTable is excluded from sync operations
_syncHandler.Exclude<LocalOnlyTable>();
await client.SyncContext.InitializeAsync(_store, _syncHandler);

免责声明:

  1. 该功能尚未投入生产,因此我不知道是否会对性能产生影响,但到目前为止在测试中似乎运行良好。
  2. 此解决方案基于 Azure 移动服务客户端 v1.3.2 源代码。当同步处理程序返回空结果时,它不会执行任何操作(拉/推)。这种行为将来可能会改变。

关于c# - Azure移动服务: Define a Table only locally,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29783543/

相关文章:

c# - 如何获取 IWindsorContainer 中已注册程序集的列表 (C#)

Python-Azure函数服务总线触发批处理

azure - 如何使用Azure应用服务/Web别名?

asp.net-mvc-4 - Azure苹果推送通知认证

C# UserControl - 在运行时添加它们

c# - 使用 HtmlHelper 创建 jQuery UI 对话框

c# - 从非结构化消息中提取数据的模式

android - Xamarin - ‘Android.Content.IntentFilter' 不是属性类

c# - 允许用户在 iPhone 上加载历史记录的最佳方式是什么?

c# - 一段时间后,在后台(iOS 和 Android)上传数据以一种奇怪的方式失败