Xamarin.Forms 中的 Azure 移动服务离线同步
Azure Mobile Service Offline Sync in Xamarin.Forms
我已经阅读了说明 In this documentation 在我的 Xamarin.Forms 客户端上实现离线同步但是当我使用同步 table 提取数据时,我目前没有得到数据云,而不是当我使用正常 table 读取数据时,我实际上正常接收数据,我不明白,这是我使用 SYncTable 获取数据的代码:
/// <summary>
/// Initialize offline sync
/// </summary>
/// <returns></returns>
public async Task InitializeAsync()
{
if(!_client.SyncContext.IsInitialized)
{
_store.DefineTable<T>();
await _client.SyncContext.InitializeAsync(_store, new MobileServiceSyncHandler());
await SyncOfflineCacheAsync();
}
}
public async Task SyncOfflineCacheAsync()
{
try
{
Debug.WriteLine("SyncOfflineCacheAsync: Initializing...");
await InitializeAsync();
// Push the Operations Queue to the mobile backend
Debug.WriteLine("SyncOfflineCacheAsync: Pushing Changes");
await _client.SyncContext.PushAsync();
// Pull each sync table
Debug.WriteLine("SyncOfflineCacheAsync: Pulling tags table");
_table = _client.GetSyncTable<T>();
string queryName = $"incsync_{typeof(T).Name}";
await _table.PullAsync(queryName, _table.CreateQuery());
}
catch (MobileServicePushFailedException e )
{
if (e.PushResult != null)
{
foreach (var error in e.PushResult.Errors)
{
await ResolveConflictAsync(error);
}
}
}
catch(Exception e)
{
throw e ;
}
}
我没有得到以前在线添加的数据
但是当我在没有离线同步的情况下获取数据时,它运行良好
var data = await baseAzureMobileService.NormalTable.ReadAsync();
据我所知,增量同步 请求如下所示:
Get https://{your-app-name}.azurewebsites.net/tables/TodoItem?$filter=(updatedAt%20ge%20datetimeoffset'2017-11-03T06%3A56%3A44.4590000%2B00%3A00')&$orderby=updatedAt&$skip=0&$top=50&__includeDeleted=true
对于增量同步,从您最新的拉取操作返回的结果的 updatedAt
时间戳将存储在您本地 SQLite 数据库的 __config
table 中,如下所示:
注意: id 列下的值的格式等于 deltaToken|{table-name}|{query-name}
.
我建议您捕获网络痕迹并检查本地 table 下的同步记录以缩小此问题的范围。由于增量同步优化了请求而不是每次都检索所有记录,我建议您利用此功能。如果您的数据集很小或者您不关心带宽,您可以选择退出增量同步。
尝试用 null 代替 queryName 调用 PullAsync,这将强制它获取所有记录,而不是尝试进行增量同步。
我已经阅读了说明 In this documentation 在我的 Xamarin.Forms 客户端上实现离线同步但是当我使用同步 table 提取数据时,我目前没有得到数据云,而不是当我使用正常 table 读取数据时,我实际上正常接收数据,我不明白,这是我使用 SYncTable 获取数据的代码:
/// <summary>
/// Initialize offline sync
/// </summary>
/// <returns></returns>
public async Task InitializeAsync()
{
if(!_client.SyncContext.IsInitialized)
{
_store.DefineTable<T>();
await _client.SyncContext.InitializeAsync(_store, new MobileServiceSyncHandler());
await SyncOfflineCacheAsync();
}
}
public async Task SyncOfflineCacheAsync()
{
try
{
Debug.WriteLine("SyncOfflineCacheAsync: Initializing...");
await InitializeAsync();
// Push the Operations Queue to the mobile backend
Debug.WriteLine("SyncOfflineCacheAsync: Pushing Changes");
await _client.SyncContext.PushAsync();
// Pull each sync table
Debug.WriteLine("SyncOfflineCacheAsync: Pulling tags table");
_table = _client.GetSyncTable<T>();
string queryName = $"incsync_{typeof(T).Name}";
await _table.PullAsync(queryName, _table.CreateQuery());
}
catch (MobileServicePushFailedException e )
{
if (e.PushResult != null)
{
foreach (var error in e.PushResult.Errors)
{
await ResolveConflictAsync(error);
}
}
}
catch(Exception e)
{
throw e ;
}
}
我没有得到以前在线添加的数据
但是当我在没有离线同步的情况下获取数据时,它运行良好
var data = await baseAzureMobileService.NormalTable.ReadAsync();
据我所知,增量同步 请求如下所示:
Get https://{your-app-name}.azurewebsites.net/tables/TodoItem?$filter=(updatedAt%20ge%20datetimeoffset'2017-11-03T06%3A56%3A44.4590000%2B00%3A00')&$orderby=updatedAt&$skip=0&$top=50&__includeDeleted=true
对于增量同步,从您最新的拉取操作返回的结果的 updatedAt
时间戳将存储在您本地 SQLite 数据库的 __config
table 中,如下所示:
注意: id 列下的值的格式等于 deltaToken|{table-name}|{query-name}
.
我建议您捕获网络痕迹并检查本地 table 下的同步记录以缩小此问题的范围。由于增量同步优化了请求而不是每次都检索所有记录,我建议您利用此功能。如果您的数据集很小或者您不关心带宽,您可以选择退出增量同步。
尝试用 null 代替 queryName 调用 PullAsync,这将强制它获取所有记录,而不是尝试进行增量同步。