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,这将强制它获取所有记录,而不是尝试进行增量同步。