与Xamarin表单和Azure Easy表同步问题

时间:2017-06-23 14:09:20

标签: azure xamarin xamarin.forms azure-mobile-services

我已经在Visual Studio中使用Azure为后端工作了一段Xamarin.Forms应用程序已经有一段时间了,而且我遇到了一个非常奇怪的问题。

请注意,我正在遵循此blog

中提到的方法

由于某些奇怪的原因,PullAsync()方法似乎有一些奇怪的问题。我创建和同步的任何数据都只能由该解决方案中的PullAsync()提取。我的意思是,如果我创建另一个访问完全相同的后端的解决方案,它可以执行它自己的创建/同步数据,但不会带来其他解决方案生成的数据,即使它们都是似乎具有完全相同的访问权限。这似乎是某种安全功能/问题,但我无法理解它。

还有其他人遇到过这个吗?有没有解决方法?如果我想创建另一个无论出于何种原因访问相同系统/数据的解决方案,这可能会导致问题。

1 个答案:

答案 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的记录。

enter image description here

如果没有记录,那么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捕获网络跟踪,以解决您的问题。