在新设备上获取Azure同步表

时间:2017-02-22 01:34:03

标签: c# azure synchronization

我为SyncTables设置了Azure应用服务。在我的开发机器上,我可以保存项目并将它们同步到云端,没问题。但是,我很难将数据传输到新设备。我假设首次在新设备上加载应用程序时,table.PullAsync()调用将获取每个表的所有数据。

推/拉过程成功完成,但没有数据被拉到设备。我可以在新设备上添加一个新项目,然后上传到云端,但我没有运气将初始数据传输到新设备上。这是我的SyncAsync方法:

private IMobileServiceSyncTable<Person> personTable = App.MobileService.GetSyncTable<Person>();
private IMobileServiceSyncTable<Card> cardTable = App.MobileService.GetSyncTable<Card>();

private async Task SyncAsync(bool showMessage)
{
    string errorString = null;

    try
    {
        await App.MobileService.SyncContext.PushAsync();
        await personTable.PullAsync("person", personTable.CreateQuery());
        await cardTable.PullAsync("cards", cardTable.CreateQuery());
    }
    catch (MobileServicePushFailedException ex)
    {
        errorString = "Push failed because of sync errors: " +
            ex.PushResult.Errors.Count + " errors, message: " + ex.Message;

        errorString = ex.PushResult.Errors.Aggregate(errorString, (current, error) => current + ("\r\n" + error.Result));
    }
    catch (Exception ex)
    {
        errorString = "Pull failed: " + ex.Message +
            "\n\nIf you are still in an offline scenario, " +
            "you can try your Pull again when connected with your Mobile Service.";
    }

    if (errorString != null)
    {
        // TODO: log some sort of error message
        MessageBox.Show(errorString);
    } 
    else
    {
        if (showMessage)
        {
            MessageBox.Show("Database synchronization complete.");
        }
        LastSynced = string.Format("Last Synced: {0}", DateTime.Now.ToString());
    }
}

正如我所说,创建的新数据将同步到新设备,但是当应用程序安装在新设备上时,我需要能够初始化数据。有没有办法强制PullAsync()调用来获取所有数据,或以某种方式让SyncTables知道他们有数据要提取,以便下次调用SyncAsync时,他们会获取数据?

这是我的InitLocalStoreAsync()方法,它在应用程序启动时初始化本地数据库。我还尝试删除localstore.db文件并再次启动,希望文件的新副本能够提取所有数据,但事实并非如此。

private async Task InitLocalStoreAsync()
{
    if (!MobileService.SyncContext.IsInitialized)
    {
        var store = new MobileServiceSQLiteStore("localstore.db");
        store.DefineTable<Person>();
        store.DefineTable<Card>();
        await MobileService.SyncContext.InitializeAsync(store);
    }
}

修改

我正在考虑的一件事是,现在我可能必须确保在添加任何数据之前安装了所有软件实例,但我希望在将来添加更多安装时能够解决这个问题。

编辑2

我尝试手动从远程数据库中获取数据并将其导入新安装,但这导致在下次同步后项目在服务器上重复。

编辑3

在添加任何数据之前安装多个实例也不起作用。两个实例都可以将数据推送到远程服务器,但是它们都不应该按原样获取新数据。我希望它像某个地方的设置一样简单,但我没有遇到我正在运行的另一个Azure应用服务的问题。

0 个答案:

没有答案