我在移动服务中使用离线数据同步,以下功能仅检索UpdatedAt>的数据。 userTable中最大的updatedAt:
await userTable.PullAsync(userTable.Where(a => a.UserName == userName));
第一次执行此功能时,它会正确检索我的数据。第二次执行该函数时,使用不同的用户名,它只会检索其中UpdatedAt大于我的SQLite数据库中已存在的最大UpdatedAt日期时间的数据。如果我在后端更改UpdatedAt字段(通过将其设置为DateTime.Now),则会检索此记录。这是设计还是我错过了什么?
答案 0 :(得分:3)
对于其他任何有此问题的人:我已经在这里找到另一个帖子,你会发现the complete answer
基本上归结为:
这将检索后端的所有记录,其中用户名为donna:
await itemTable.PullAsync(itemTable.Where(a => a.UserName == "donna"));
这将检索用户名为" donna"的所有记录。第一次,之后只更新了记录。 (增量值)
await itemTable.PullAsync("itemtabledonna", itemTable.Where(a => a.UserName == "donna"));
第一个参数是queryKey。这用于跟踪您对后端的请求。一个非常重要的事情是这个queryKey有一个限制:
^[a-zA-Z][a-zA-Z0-9]{0,24}$
含义:字母数字字符,最多25个字符。所以也没有连字符(在撰写本文时)。如果您的queryKey与此正则表达式不匹配,则不会返回任何recrods。目前没有抛出异常,也没有关于此的文档。
答案 1 :(得分:2)
当您传入查询键时,PullAsync()应该使用增量同步(仅记录具有比其检索的最后一条记录更新的日期的记录)。如果没有,它应该执行您的查询并下拉所有匹配的记录。
如果你在不传递查询密钥的情况下获得该行为,这听起来就像是一个错误。
此外,在增量同步的情况下,它不是SQLite DB中的最新更新,而是上次运行PullAsync()的缓存版本(在给定的查询键下缓存)
默认情况下,您的updatedAt列会有一个触发器,导致其时间戳在修改行时更新,因此您在使用增量同步时不必采取任何其他操作。
如果上述内容不是您所看到的,我建议您针对azure-mobile-services提交github错误,以便对其进行审核。