2017-02-22 6 views
0

SyncTablesのAzureアプリケーションサービスを設定しました。私の開発マシンでは、アイテムを保存することができ、クラウドに同期しても問題はありません。しかし、私は新しいデバイスにデータを取得するのに苦労しています。最初に新しいデバイスにアプリケーションをロードするときに、table.PullAsync()が呼び出すと、各テーブルのすべてのデータがフェッチされると仮定しました。新しいデバイスでAzure同期テーブルを取得します

プッシュ/プルプロセスは正常に完了しましたが、データはデバイスにプルされません。私は新しいデバイスに新しいアイテムを追加することができ、それはクラウドにアップロードされますが、私は新しいデバイスに初期データを取得する運がないと思います。私は、アプリケーションが新しいデバイスにインストールされている場合に作成された新しいデータを新しいデバイスに同期しますが、私は、データの初期プルを行うことができるようにする必要があり、言ったように

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()); 
    } 
} 

:ここに私のSyncAsync方法があります。 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); 
    } 
} 

EDIT

ことの一つは、多分、今の私は、任意のデータを追加する前に、必ずソフトウェアのすべてのインスタンスがインストールされていることを確認する必要があることですが、私はこれを考え出した取得したいです将来的にインストールを増やす場合には、削除する必要があります。

EDIT 2

私は手動でリモート・データベースからデータをフェッチし、新しいインストールにインポートしようとしたが、それはアイテムが次の同期後にサーバ上に複製させます。また、動作しませんでした任意のデータを追加する前に、複数のインスタンスをインストールする

EDIT 3

。どちらのインスタンスもリモートサーバーにデータをプッシュできますが、どちらも新しいデータをフェッチする必要はありません。私はそれがどこかの設定のような単純なものだと思っていますが、私が実行している別のAzureアプリケーションサービスではこの問題はありません。

答えて

0

問題は、古いNuGetパッケージWindowsAzure.MobileServicesWindowsAzure.MobileServices.SQLiteStoreを使用しようとしていたことに終わりました。新しいMicrosoft.Azure.Mobile.Clientとパッケージを使用するように変更すると、すべて正常に動作します。

新しいAzureシステムプロパティには先頭に__という文字列が含まれていないため、古いパッケージではサーバー上の新しいデータを比較する方法がわかりませんでした。

関連する問題