在线数据库发生更改时,如何将iPhone本地数据库同步到在线数据库?

在线数据库发生更改时,如何将iPhone本地数据库同步到在线数据库?,iphone,sql,core-data,soap,synchronization,Iphone,Sql,Core Data,Soap,Synchronization,目前,我的应用程序在需要数据时通过ASP.NET XML web服务使用SOAP从Microsoft SQL 2005数据库中提取数据 我想更改我的应用程序,使其具有本地数据库,该数据库将检查数据是否已更改,并将自身同步到任何新数据 我如何判断是否有任何新数据 我是否只计算SQL表中的行数,如果它小于CoreData数据库中的行数,则重新写入CoreData数据库 是否有一种方法可以告诉您仅同步已更改或已添加/删除的记录 我应该在应用程序启动时同步所有数据,还是只同步与加载视图对应的表 非常感谢

目前,我的应用程序在需要数据时通过ASP.NET XML web服务使用SOAP从Microsoft SQL 2005数据库中提取数据

我想更改我的应用程序,使其具有本地数据库,该数据库将检查数据是否已更改,并将自身同步到任何新数据

我如何判断是否有任何新数据

我是否只计算SQL表中的行数,如果它小于CoreData数据库中的行数,则重新写入CoreData数据库

是否有一种方法可以告诉您仅同步已更改或已添加/删除的记录

我应该在应用程序启动时同步所有数据,还是只同步与加载视图对应的表

非常感谢您的帮助

谢谢,
-Mike

如果你在模式设计方面比你所能做的还要聪明。最好的选择可能是将“created_at”和“updated_at”日期字段添加到数据库表中(并在修改或创建记录时进行设置)。然后在同步请求查询中,选择日期大于本地数据库中最高日期的所有记录。这将适用于单向同步。双向同步要困难得多,需要考虑接触分辨率


至于同步,我建议尽可能在后台进行。您应该能够使用
NSFetchedResultsController
在获取新记录时处理视图更新。这样,用户就不会遇到任何恼人的加载屏幕。

如果你对模式设计非常聪明,你就可以。最好的选择可能是将“created_at”和“updated_at”日期字段添加到数据库表中(并在修改或创建记录时进行设置)。然后在同步请求查询中,选择日期大于本地数据库中最高日期的所有记录。这将适用于单向同步。双向同步要困难得多,需要考虑接触分辨率


至于同步,我建议尽可能在后台进行。您应该能够使用
NSFetchedResultsController
在获取新记录时处理视图更新。这样用户就不会遇到任何恼人的加载屏幕。

您需要一种方法来检测自上次连接以来数据库中发生的更改。SQLServer为此提供了两个框架:和。有关两者的比较,请参阅。Net利用这些框架来自动化数据同步

不幸的是,这些在SQLServer2005中都不可用。它们都是SQL Server 2008的功能,因此您必须升级

使用SQL Server 2005,您只能手动跟踪更改。有几种方法,都不完善,它们都围绕触发器和跟踪表,或者围绕使用时间戳跟踪行版本(问题总是如何跟踪删除的行)


虽然核心数据内置了对同步的支持(请参阅),但它不能用于您的场景。

您需要一种方法来检测自上次连接以来数据库中发生的更改。SQLServer为此提供了两个框架:和。有关两者的比较,请参阅。Net利用这些框架来自动化数据同步

不幸的是,这些在SQLServer2005中都不可用。它们都是SQL Server 2008的功能,因此您必须升级

使用SQL Server 2005,您只能手动跟踪更改。有几种方法,都不完善,它们都围绕触发器和跟踪表,或者围绕使用时间戳跟踪行版本(问题总是如何跟踪删除的行)


虽然核心数据内置了对同步的支持(请参阅),但它在您的场景中不可用。

由于删除了记录,事情通常会稍微复杂一些。此外,由于时钟漂移、时区差异和夏令时,日期/时间作为一种类型在跟踪变化方面是出了名的不好。不断增加的序列号通常更好。顺便说一句,我同意从10公里英尺的角度来看,这是需要做的。虽然细节远不是琐碎的,甚至没有冲突解决方案。很好,雷姆斯。它肯定不会处理删除(这可能需要某种软删除)。然而,我目前正在使用时间戳方法来管理应用程序中的同步,它似乎正在工作。我在数据库中生成所有时间戳表单(然后使用核心数据属性中的最新值进行查询,而不是设备时间)。你提到的问题还会影响到这一点吗?谢谢。如果你使用当地时间,是的,特别是因为夏令时的问题。使用UTC时间更好。我喜欢使用created_at和Update_at字段的想法,我会始终使用服务器时间保持一致。因此,假设此人首次加载应用程序并同步数据库。当用户返回并加载应用程序时,我决定要同步。我现在要检查每个记录,看看它当前是否存在,如果它没有将其添加到本地数据库中。如果确实存在,请检查更新的_at字段,如果该日期大于本地数据库中的当前日期,请更新该记录?由于删除了记录,事情通常会稍微复杂一些。此外,由于时钟漂移、时区差异和夏令时,日期/时间作为一种类型在跟踪变化方面是出了名的不好。不断增加的序列号通常更好。顺便说一句,我同意从10公里英尺的角度来看,这是需要做的。虽然细节远不是琐碎的,甚至没有冲突解决方案。很好,雷姆斯。它肯定不会处理删除(这可能需要某种软删除)。然而,我目前正在使用时间戳方法来管理应用程序中的同步,它似乎正在工作。一代