Azure应用程序服务 – 脱机同步 – PullAsync事务
我正在使用Xamarin.Forms和Azure应用程序服务的应用程序。 用户必须明确执行数据同步。 当用户开始数据同步时,会执行很多这种方法来从服务器获取当前数据:
await this.ISyncTable.PullAsync(queryId, query, cancellationToken).ConfigureAwait(false);
我的问题:应用程序可能会进入不一致的状态。 例如,当用户在数据同步完成之前closures应用程序。 在这种状态下,应用程序不可用。
编辑:
为了使它更容易理解:假设我有一个表“ToDoItem”和“ToDoCategory”。 用户启动数据同步。 数据同步运行,并成功检索所有的ToDoItems。 在下一步中,数据同步将得到ToDoCategories(对PullAsync的另一个调用),但是在此之前用户closures了该应用程序。 现在我有所有的ToDoItems,但没有ToDoCategories。 但是,没有ToDoCategories,该应用程序是不可用的。 这是一个非常简单的例子。 数据结构在实际项目中要复杂得多。 实体之间有很多依赖关系。
logging同步错误/取消并在下一次应用程序启动时提示用户进行另一次同步是无法解决的。 假设在下一个应用程序启动时用户没有互联网连接,并且不能执行数据同步。 我无法locking应用程序单元下一次成功的数据同步。
有没有办法在事务中运行多个PullAsync操作?
有没有办法在事务中运行多个PullAsync操作?
简短的回答是不,没有。 在所有PullAsync操作完成时设置一个标志,或者跟踪哪些表已成功同步。
logging同步错误/取消并在下一次应用程序启动时提示用户进行另一次同步是无法解决的。 假设在下一个应用程序启动时用户没有互联网连接,并且不能执行数据同步。 我无法locking应用程序单元下一次成功的数据同步。
如果用户开始同步但在同步完成之前离开了应用程序,那么第二次运行时应用程序的预期行为是什么? 完成同步? 提示用户重新开始?
也可以考虑在用户离开后,应用程序可能会在后台继续同步。 在iOS中,您必须使用UIApplication beginBackgroundTaskWithExpirationHandler
来协调操作系统。
我的问题:应用程序可能会进入不一致的状态。 例如,当用户在数据同步完成之前closures应用程序。 在这种状态下,应用程序不可用。
如果您指定查询ID(非空),那么您将使用增量同步进行拉取操作。 正如有关增量同步的官方文档所述:
拉操作的第一个参数是仅在客户端上使用的查询名称。 如果您使用非空查询名称,则Azure Mobile SDK将执行增量式同步。 每次pull操作返回一组结果时,来自该结果集的最新updatedAt时间戳都存储在SDK本地系统表中。 后续的拉取操作只能检索该时间戳之后的logging 。
成功检索数据并更新到本地数据存储区后,客户端SDK将更新/插入带有最新updatedAt时间戳记的__config
表以及id等于deltaToken|{table-name}|{query-id}
为你的SQLite数据库如下:
此外,检索logging后,客户端SDK将执行下面的SQL语句来更新您的本地数据存储:
假设您已经为TodoItem
表检索了50条logging。
BEGIN TRANSACTION
(@ p0),(@ p1),(@ p2),(@ p3),(@ p4),(@ p5),(@ p6),(@ p6),(@ p6)插入或忽略INTO [TodoItem] 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
。
。
提交事务
BEGIN TRANSACTION
INSERT或IGNORE INTO [__config]([id])VALUES(@ p0)
UPDATE [__config] SET [value] = @ p0 WHERE [id] = @ p1
提交事务
pullasync
的默认MaxPageSize
是50,如果三个数据更多,客户端会自动发送多个请求。 请注意,在页面中检索logging之后,检索的数据将更新到本地数据存储区,然后发送下一个页面请求。 根据我的理解,如果用户在数据同步完成之前closures应用程序,那么数据将不会更新到最新,当用户再次打开应用程序时,那么缺失的数据将根据最新的数据更新到您的数据存储updatedAt时间戳。