Syncing Problems with Xamarin Forms and Azure Easy Tables

后端 未结 1 1968
梦谈多话
梦谈多话 2021-01-27 23:30

I\'ve been working on a Xamarin.Forms application in Visual Studio using Azure for the backend for a while now, and I\'ve come across a really strange issue.

Please not

1条回答
  •  生来不讨喜
    2021-01-28 00:06

    For some strange reason the PullAsync() method seems to have some bizarre problems. Any data that I create and sync will only be pulled by PullAsync() from that solution.

    According to your provided tutorial, I found that the related PullAsync is using Incremental Sync.

    await coffeeTable.PullAsync("allCoffees", coffeeTable.CreateQuery());
    

    Incremental Sync:

    the first parameter to the pull operation is a query name that is used only on the client. If you use a non-null query name, the Azure Mobile SDK performs an incremental sync. Each time a pull operation returns a set of results, the latest updatedAt timestamp from that result set is stored in the SDK local system tables. Subsequent pull operations retrieve only records after that timestamp.

    Here is my test, you could refer to it for a better understanding of Incremental Sync:

    Client : await todoTable.PullAsync("todoItems-02", todoTable.CreateQuery());

    The client SDK would check if there has a record with the id equals deltaToken|{table-name}|{query-id} from the __config table of your SQLite local store.

    If there has no record, then the SDK would send a request as following for pulling your records:

    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

    Note: the $filter would be set as (updatedAt ge datetimeoffset'1970-01-01T00:00:00.0000000+00:00')

    While there has a record, then the SDK would pick up the value as the latest updatedAt timestamp and send the request as follows:

    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

    Per my understanding, if you handle the same logical query with the same query id (non-null) in different mobile client, you need to make sure the local db is newly created by each client. Also, if you want to opt out of incremental sync, pass null as the query ID. In this case, all records are retrieved on every call to PullAsync, which is potentially inefficient. For more details, you could refer to How offline synchronization works.

    Additionally, you could leverage fiddler for capturing the network traces when you invoke the PullAsync, in order to troubleshoot your issue.

    0 讨论(0)
提交回复
热议问题