将脱机更改与核心数据中的原始数据分开保存



我正在为我目前正在开发的应用程序添加"脱机模式"功能。基本上,这个想法是用户应该能够在不连接到互联网的情况下对数据进行更改,例如编辑项目的描述,并且这些更改应该在应用程序启动之间保持有效。

在线工作时,每次更改通常会导致API请求,但在离线模式下情况不同。

目前,这是通过将来自API的所有数据存储在作为缓存的核心数据数据库中来实现的。除了正常属性外,用户还可以编辑的实体有以下属性:

  • locallyCreated-对象是否脱机创建
  • locallyDeleted-对象已脱机删除
  • locallyUpdated-已更新

这使得在进行同步时可以查找新的/删除的/更新的对象并发送相应的API请求。

这对于创建和删除对象很有效,但是,我发现这种方法的一个缺点是,当从API检索新数据时,所有本地更改(即标记为本地更新的对象的属性)都会丢失,这意味着它们必须以某种方式单独存储。

解决这个问题的最佳方法是什么?

由于您有locallyUpdated密钥,显而易见的答案是修改导入服务器更改的代码,这样它就不会覆盖对任何标记为已更改的对象的更改。无论如何,你需要避免覆盖这些更改,并且你已经记录了哪些对象更改,所以你已经有了基本解决方案的工具。

但您很快就会遇到同步数据的复杂性。如果本地对象在一个密钥上发生了更改,但来自服务器的传入数据在另一个密钥中发生了更改怎么办?你不能仅仅通过知道本地副本以某种方式发生了更改来解决这个问题。也许您决定服务器总是获胜,或者本地副本总是获胜。这些都很简单,如果它们对你的应用程序有意义的话。如果您需要合并更改,那么您还有一些工作要做。您不仅需要记录一个指示已进行更改的布尔值,还需要记录已更改键的列表。这可能会变得复杂,但这是数据同步的本质。

相关内容

最新更新