我已经在Visual Studio中使用Azure为后端工作了一段Xamarin.Forms应用程序已经有一段时间了,而且我遇到了一个非常奇怪的问题。
请注意,我正在遵循此blog
中提到的方法由于某些奇怪的原因,PullAsync()方法似乎有一些奇怪的问题。我创建和同步的任何数据都只能由该解决方案中的PullAsync()提取。我的意思是,如果我创建另一个访问完全相同的后端的解决方案,它可以执行它自己的创建/同步数据,但不会带来其他解决方案生成的数据,即使它们都是似乎具有完全相同的访问权限。这似乎是某种安全功能/问题,但我无法理解它。
还有其他人遇到过这个吗?有没有解决方法?如果我想创建另一个无论出于何种原因访问相同系统/数据的解决方案,这可能会导致问题。
答案 0 :(得分:1)
由于某些奇怪的原因,PullAsync()方法似乎有一些奇怪的问题。我创建和同步的任何数据都只能由该解决方案中的PullAsync()提取。
根据您提供的教程,我发现相关的PullAsync
正在使用增量同步。
await coffeeTable.PullAsync("allCoffees", coffeeTable.CreateQuery());
增量同步:
pull操作的第一个参数是仅在客户端上使用的查询名称。如果使用非空查询名称,则Azure Mobile SDK将执行增量同步。 每次pull操作返回一组结果时,该结果集中的最新updatedAt时间戳存储在SDK本地系统表中。后续拉取操作仅检索该时间戳之后的记录。
这是我的测试,你可以参考它来更好地理解增量同步:
客户:await todoTable.PullAsync("todoItems-02", todoTable.CreateQuery());
客户端SDK将检查SQLite本地存储的deltaToken|{table-name}|{query-id}
表中是否存在id等于__config
的记录。
如果没有记录,那么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捕获网络跟踪,以解决您的问题。