我在 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);
免责声明:
- 该功能尚未投入生产,因此我不知道是否会对性能产生影响,但到目前为止在测试中似乎运行良好。
- 此解决方案基于 Azure 移动服务客户端 v1.3.2 源代码。当同步处理程序返回空结果时,它不会执行任何操作(拉/推)。这种行为将来可能会改变。
关于c# - Azure移动服务: Define a Table only locally,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29783543/