由于某些奇怪的原因,PullAsync() 方法似乎有一些奇怪的问题。我创建和同步的任何数据都只能由 PullAsync() 从该解决方案中提取。
根据您提供的教程,我发现相关的PullAsync 正在使用增量同步。
await coffeeTable.PullAsync("allCoffees", coffeeTable.CreateQuery());
增量同步:
拉取操作的第一个参数是一个仅在客户端使用的查询名称。如果使用非空查询名称,Azure 移动 SDK 会执行增量同步。 每次拉取操作返回一组结果时,该结果集中的最新 updatedAt 时间戳都会存储在 SDK 本地系统表中。随后的拉取操作仅检索该时间戳之后的记录。
这是我的测试,您可以参考它以更好地了解增量同步:
客户:await todoTable.PullAsync("todoItems-02", todoTable.CreateQuery());
客户端 SDK 将检查 SQLite 本地存储的 __config 表中是否有 id 等于 deltaToken|{table-name}|{query-id} 的记录。
如果没有记录,那么SDK会发送如下请求来拉取你的记录:
https://{your-mobileapp-name}.azurewebsites.net/tables/TodoItem?$filter=(updatedAt%20ge%20datetimeoffset'1970-01-01T00%3A00%3A00.0000000%2B00%3A00')&$orderby=updatedAt&$skip=0&$top=50&__includeDeleted=true
注意:$filter 将被设置为(updatedAt ge datetimeoffset'1970-01-01T00:00:00.0000000+00:00')
当有记录时,SDK 会选取value 作为最新的 updatedAt 时间戳,并按如下方式发送请求:
https://{your-mobileapp-name}.azurewebsites.net/tables/TodoItem?$filter=(updatedAt%20ge%20datetimeoffset'2017-06-26T02%3A44%3A25.3940000%2B00%3A00')&$orderby=updatedAt&$skip=0&$top=50&__includeDeleted=true
根据我的理解,如果您在不同的移动客户端处理具有相同查询 id(非空)的相同逻辑查询,则需要确保每个客户端新创建本地数据库。此外,如果您想退出增量同步,请将 null 作为查询 ID 传递。在这种情况下,每次调用PullAsync 时都会检索所有记录,这可能是低效的。更多详情可以参考How offline synchronization works。
此外,您可以在调用PullAsync 时利用fiddler 捕获网络跟踪,以便解决您的问题。