2017-06-29 22 views
-1

我正在使用Xamarin.Forms和Azure App Service的應用程序。 用戶必須明確執行數據同步。當用戶啓動一個數據同步很多的這個方法是執行從服務器獲取當前數據:Azure應用服務 - 離線同步 - PullAsync交易

await this.ISyncTable.PullAsync(queryId, query, cancellationToken).ConfigureAwait(false); 

我的問題:應用程序進入不一致的狀態。例如,當用戶在數據同步完成之前關閉應用程序時。在這種狀態下,應用程序不可用。

編輯:

爲了更容易理解:假設我有一個表「的TodoItem」和「ToDoCategory」。用戶開始數據同步。數據同步運行併成功檢索所有ToDoItem。在下一步中,數據同步將獲得ToDoCategories(對PullAsync的另一個調用),但在此之前用戶關閉應用程序。現在我擁有所有的ToDoItems,但沒有ToDoCategories。但該應用程序不適用於沒有ToDoCategories。這是一個非常簡單的例子。實際項目中的數據結構要複雜得多。實體之間有很多依賴關係。

記錄同步錯誤/取消並在下一次應用程序啓動時提示用戶進行另一次同步是不行的。假設在下一次應用程序啓動時用戶沒有互聯網連接,並且無法執行數據同步。我無法鎖定應用單元下一次成功的數據同步。

有沒有辦法在事務中運行多個PullAsync操作?

回答

1

有沒有辦法在事務中運行多個PullAsync操作?

簡短答案是否定的,沒有。在所有PullAsync操作完成時設置一個標誌,或跟蹤哪些表已成功同步。

記錄同步錯誤/取消並在下一次應用程序啓動時提示用戶進行另一次同步是不行的。假設在下一次應用程序啓動時用戶沒有互聯網連接,並且無法執行數據同步。我無法鎖定應用單元下一次成功的數據同步。

如果用戶開始同步但在同步完成之前離開應用程序,那麼第二次運行時您的應用程序的預期行爲是什麼?完成同步?提示用戶重新開始?

另外考慮應用程序可能可能會繼續在用戶離開後在後臺同步。在iOS中,您必須使用UIApplication beginBackgroundTaskWithExpirationHandler與操作系統進行協調。

+0

謝謝你的回答。我認爲微軟應該在他們的SDK中直接擁有這樣的功能。它不僅僅是用戶關閉應用程序。在同步過程中可能存在網絡錯誤。主要問題是當同步中止時,本地設備上的數據可能不一致。需要類似Rollback的功能在未完成同步期間撤銷本地數據庫中的所有更改。我會考慮並在此處發佈我的解決方案... – OPunktSchmidt

+0

我同意,SDK不適合具有多個相互依賴的表的應用程序。您可能希望創建一個自定義API,該API可以在一個HTTP請求中返回整個數據集合,並在本地存儲結果,但是您沒有利用SDK的離線同步功能。 –

+0

另請參閱Adrian Hall關於使用Azure移動應用程序構建移動應用程序的書,特別是關於對象關係的這一部分:https://adrianhall.github.io/develop-mobile-apps-with-csharp-and-azure/chapter3/relationships /「我們沒有事務允許同時更新數據庫中的多個表,每個表中的每個記錄都單獨更新,離線同步使用的推送過程對於表之間的關係如何工作具有重要影響,具體來說,只有單向關係才能在離線同步世界中發揮作用。「 –

0

我的問題:應用程序可能會進入不一致的狀態。例如,當用戶在數據同步完成之前關閉應用程序時。在這種狀態下,應用程序不可用。

如果指定的查詢ID(非空),那麼你可以使用增量同步拉操作。正如document提到關於增量同步:

拉操作的第一個參數是查詢名稱,僅在客戶端使用。如果您使用非空查詢名稱,則Azure Mobile SDK會執行增量同步。 每當pull操作返回一組結果時,來自該結果集的最新updatedAt時間戳就存儲在SDK本地系統表中。隨後的拉取操作僅在該時間戳之後檢索記錄。

成功後獲取數據並更新到您的本地數據存儲,然後在客戶端SDK將更新/從拉的結果插入__config表最新updatedAt時間戳連同您的SQLite數據庫作爲id等於deltaToken|{table-name}|{query-id}如下:

此外,後檢索記錄,客戶端SDK將執行下面的SQL語句用於更新本地數據存儲:

假設您已檢索到TodoItem表的50個記錄。

BEGIN TRANSACTION

INSERT或忽略INTO [的TodoItem]([ID])VALUES(@ P0),(@ P1),(@ P2),(@ P3),(@ P4), (@ P5),(@ P6),(@ P7),(@ P8),(@ P9),(@ P10),(@ P11),(@ P12),(@ P13),(@ P14), (@ P15),(@ P16),(@ P17),(@ P18),(@ P19),(@ P20),(@ P21),(@ P22),(@ P23),(@ P24), (@ P25),(@ P26),(@ P27),(@ P28),(@ P29),(@ P30),(@ P31),(@ P32),(@ P33),(@ P34), (@ P35),(@ P36),(@ P37),(@ P38),(@ P39),(@ P40),(@ P41),(@ P42),(@ P43),(@ P44), (@ p45),(@ p46),(@ p47),(@ p48),(@ p49)

UPDATE [TodoItem] SET [Text] = @ p0,[UserId] = @ p1 WHERE [id] = @ p2

UPDATE [TodoItem] SET [Text] = @ p0,[UserId] = @ p1 WHERE [id] = @ p2

COMMIT TRANSACTION

BEGIN TRANSACTION

INSERT或忽略INTO [__config]([ID])VALUES(@ P0)

UPDATE [__config] SET [值] = @ P0 WHERE [ ID] = @ P1

COMMIT TRANSACTION

爲0的默認是50,如果三個數據更多,客戶端會自動發送多個請求。請注意,在頁面中檢索記錄後,檢索到的數據將更新到本地數據存儲區,然後發送下一個頁面請求。根據我的理解,如果用戶在數據同步完成之前關閉了應用程序,則數據不會更新到最新狀態,當用戶再次打開應用程序時,則會根據最新的數據將缺失的數據更新到您的數據存儲區updatedAt時間戳。

+0

謝謝你的回答,但我認爲這不是與我的問題有關的解決方案。爲了更容易理解:假設我有一個表「ToDoItem」和「ToDoCategory」。用戶開始數據同步。數據同步運行併成功檢索所有ToDoItem。在下一步中,數據同步將獲得ToDoCategories(對PullAsync的另一個調用),但在此之前用戶關閉應用程序。現在我擁有所有的ToDoItems,但沒有ToDoCategories。但該應用程序不適用於沒有ToDoCategories。我更新了我的第一篇文章。 – OPunktSchmidt

相關問題