2017-03-01 3 views
0

IMobileServiceSyncHandlerを実装しています。私の目標は、「サーバは常にメカニズムを獲得する」ことです。したがって、競合が検出されると、IMobileServiceSyncHandlerはローカルコピーをサーバーコピーで上書きする必要があります。IMobileServiceSyncHandler - ローカルバージョンをオーバーライド

class MySyncHandler : IMobileServiceSyncHandler 
    { 
     public IMobileServiceSyncTable<Error> localTable; 
     IMobileServiceClient client; 

     public MySyncHandler(IMobileServiceClient client) 
     { 
      this.client = client; 
     } 

     public async Task<JObject> ExecuteTableOperationAsync(IMobileServiceTableOperation operation) 
     { 
      JObject result = null; 
      MobileServicePreconditionFailedException conflictError = null; 
      do 
      { 
       try 
       { 
        result = await operation.ExecuteAsync(); 
       } 
       catch (MobileServicePreconditionFailedException e) 
       { 
        conflictError = e; 


       } 

       if (conflictError != null) 
       { 
        JObject serverItem = conflictError.Value; 

        if (serverItem == null) 
        { 
         serverItem = (JObject)(await operation.Table.LookupAsync((string)operation.Item[MobileServiceSystemColumns.Id])); 
        } 

        await localTable.UpdateAsync(serverItem); 

       } 
      } while (conflictError != null); 

      return result; 
     } 

     public Task OnPushCompleteAsync(MobileServicePushCompletionResult result) 
     { 
      return Task.FromResult(0); 
     } 
    } 

関連する部分は次のとおりです:

await localTable.UpdateAsync(serverItem); 

私の考えは、サーバのバージョンを使用してローカルテーブルを更新することです

は、ここに私のコードです。

問題:

これは機能しません。ローカルコピーは変更されません。それはローカルバージョンに残ります。

お手伝いできますか?

+1

conflictError = nullのため、conflictErrorを取得した場合はdo/whileループを終了しません。ループの外側でのみ呼び出されます。明確にすることはできますか? –

+0

はい、これは少し奇妙に見えます。しかし、マイクロソフトの公式の例とループが機能します。私の問題は、localTable.UpdateAsync(serverItem)を待っていることです。は動作しません – OPunktSchmidt

+0

"公式のサンプル"はどこですか?あなたはリンクを提供できますか? localTableが変わらないことをどうお知りしますか? UIに基づいているか、ブレークポイントのデータが表示されますか?また、UpdateAsyncにはパラメータとして競合を提供できるバージョンがオーバーロードされています。あなたはそれを試しましたか? –

答えて

1

さらに詳しいエンジニアの例はAzure Mobile Services - Handling Conflicts with Offlineです。競合があるときのためにifブロック内

await localTable.UpdateAsync(serverItem); 

:レコードのサーバのバージョンを維持するためには

は、この行を置き換えます。

+0

できるだけ早く試してみます。ありがとうございました – OPunktSchmidt

関連する問題