Azure移动服务:仅在本地定义表

时间:2015-04-21 21:35:22

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

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

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

当我拉出我的一张桌子时会出现问题:

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

我得MobileServicePushFailedException404 LocalOnlyTable does not exist

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

2 个答案:

答案 0 :(得分:4)

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

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 Mobile Services客户端v1.3.2源代码。当synchandler返回null结果时,它没有做任何事情(拉/推)。这种行为将来可能会改变。

答案 1 :(得分:2)

跟踪使用MSSyncTable API执行的所有操作都将发送到服务器。如果您有一个表,您不想跟踪您不应该使用MSSyncTable API来插入/更新记录。

您应该能够使用SQLiteStore方法(如upsert)或在SQLite Db上直接为未跟踪的表执行SQL。