如何在Azure Mobile App Service客户端上处理孤立记录

本文关键字:处理 记录 客户端 Service Azure Mobile App | 更新日期: 2023-09-27 17:58:08

我正在使用Azure移动应用程序服务。我正在使用软删除和增量同步功能。

我遇到了一个有趣的边缘案例:

  1. 将新记录插入本地数据库
  2. Push
  3. 记录在后端被删除。可以在客户端上通过使用client.GetTable<T>().DeleteAsync(foo)而不是client.GetSyncTable<T>().DeleteAsync(foo)直接删除来模拟
  4. 本地数据库现在比远程数据库多了一条记录
  5. 再次推

我以为最后一次推送会在远程数据库上重新创建记录,但事实并非如此——这令人惊讶,非常非常棒,因为这是合乎逻辑的结果

我不明白的是,为什么?客户端如何知道不推送该孤立记录

(是因为我从客户端执行了删除吗?所以在生产中,当我们的后端系统删除该记录时,客户端会推送它?)

编辑,很抱歉我没有正确解释:
我的意思是,我们有后端系统,可以直接在后端数据库上执行删除(他们不知道或不关心远程客户端)。我在上面提到了第3点,只是作为一种从客户端本身做到这一点的"黑客"方式。无论如何,在这种情况下,客户端上会有一个孤立的记录。当这种情况发生,并执行推送时,客户端是否会尝试在后端重新创建该记录,因为它不知道后端删除了它?

如何在Azure Mobile App Service客户端上处理孤立记录

软删除是客户端知道如何删除"孤立"记录的方法。换句话说,服务器实际上并没有删除记录,只是标记了已删除的标志。正在进行脱机同步的客户端将作为拉取操作的一部分获得已删除的记录,并从本地存储中删除这些记录。(他们通过在请求中添加__includedDeleted=true标志来实现这一点。)

如果客户端更改了已删除的记录,并且您正在使用冲突处理(通过在客户端上设置"版本"字段),则更新将通过常规冲突处理机制被拒绝。

创建同步表时,会在本地SQLite数据库中创建两个表——实际表和"挂起操作"表。执行SyncTable().DeleteAsync()时,会从实际表中删除该记录,并在"挂起的操作"表中放置一个条目以删除后端的记录。执行PushAsync()时,挂起的操作表用于发送本应在在线案例中发送的请求。

还有一些比这更复杂的事情,但这是正在发生的事情的基本要点

如果您可以访问底层的SQLite数据库(例如,您在Windows上运行UWP应用程序),那么您可以检查底层的SQLte数据库,看看实际发生了什么。