我在Xamarin应用中使用离线同步。我有以下情况:
我有几个同步正常的表和一个名为LocalOnlyTable
的表,我不想同步。我只是想在本地读/写它。
当我拉出我的一张桌子时会出现问题:
await exerciseTable.PullAsync(string.Format("{0}ItemByFK", typeof(Exercise).Name), exerciseTable.CreateQuery());
我得MobileServicePushFailedException
说404 LocalOnlyTable does not exist
。
我想知道为什么移动服务试图推/拉LocalOnlyTable
和
如何阻止移动服务尝试同步LocalOnlyTable
?
答案 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)
跟踪使用MSSyncTable API执行的所有操作都将发送到服务器。如果您有一个表,您不想跟踪您不应该使用MSSyncTable API来插入/更新记录。
您应该能够使用SQLiteStore方法(如upsert)或在SQLite Db上直接为未跟踪的表执行SQL。