我为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应用服务的问题。