Xamarin.Forms中的Azure移动服务脱机同步

时间:2018-04-23 13:22:34

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

我已完成说明In this documentation要在我的Xamarin.Forms客户端上实现离线同步但是当我使用同步表提取数据时,我目前无法获取云中的数据,而是当我使用普通表读取数据时,我实际上正常接收数据,我不明白,这是我使用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();

2 个答案:

答案 0 :(得分:0)

AFAIK,增量同步请求如下所示:

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表中,如下所示:

注意: id列下的值格式等于deltaToken|{table-name}|{query-name}

我建议您捕获网络跟踪并检查本地表下的同步记录以缩小此问题。由于增量同步优化了请求而不是每次都检索所有记录,我建议您利用此功能。如果您的数据集较小或者您不关心带宽,则可以选择退出增量同步。

答案 1 :(得分:0)

尝试使用null调用PullAsync代替queryName,这将强制它获取所有记录,而不是尝试进行增量同步。