2010-06-06 87 views
7

我正在从一个服务器(XML,JSON等)提取数据的常规iPhone应用程序,我想知道实现同步数据的最佳方式是什么。标准是速度(较少的网络数据交换),健壮性(在更新失败的情况下数据恢复),脱机访问和灵活性(当数据库结构稍微改变时可以调整,如新列)。我知道它因应用程序而异,但你们可以分享一些你的战略/经验吗?在iPhone应用程序中同步数据的最佳策略

对于我来说,我想的是这样的:在启动

1)店铺最后修改日期在iPhone

2),发送邮件一样getNewData.php lastModifiedDate = ...?

3)服务器将处理并发回上次修改后的数据。

4)该数据被格式化为这样:

<+><data id="..."></data></+> // add this to SQLite/CoreData

<-><data id="..."></data></-> // remove this

<%><data id="..."><attribute>newValue</attribute></data></%> // new modified value

我不想让< +>,< - >,<%> ...对于每个属性也是如此,因为它太复杂了,所以很可能当收到一个<%字段时,我会删除数据与指定的ID,然后再次添加(假设这里的ID不是一些自动自动增加的字段)。

5)一旦下载并更新了所有内容,我将更新上次修改日期字段。

该策略的主要问题是:如果网络在我更新某些内容时出现故障=>上次修改日期尚未更新=>下次重新启动应用程序时,我将不得不经历相同的事情再次。更不用说潜在的不一致数据。如果我使用临时表进行更新并使整个事情成为原子,它将起作用,但如果更新过长(大量数据更改),则用户必须等待很长时间,直到有新数据可用。我应该为每个数据字段使用Last-Modified-Date并逐渐更新数据吗?

回答

2

我会先将更新例程设为原子,因为您将掌握足够的知识来确定如何使客户端 - 服务器通信正常工作。

之后是考虑调整增量的好时机,但是只有在您做了一些测试以确定它是否真的有必要之后。如果您将您的更新协议调整为尽可能低的带宽,您可能会发现即使是“大”更新也足够快速下载。

另一种看待它的方法是问问自己,当普通用户进行同步时,多长时间会出现网络故障?你可能不想调整不太可能发生的情况。

如果您试图优化(最小化)数据传输,您可能需要考虑与XML不同的格式,因为XML相当详细。或者至少您可能希望通过使每个元素名称和属性尽可能小来消除空间的XML可读性,并消除所有不必要的空白。

0

您的基本方案很好。您需要做的是以某种方式使您的更新变得幂等,以便您可以重新启动部分完成的传输而没有风险。这是比尝试实现某种真正的原子提交更好的方法(尽管你也可以使用例如SQLite数据库)。

根据我们的经验,如果服务器足够快,可以非常快速地下载相当大的更新(10 KB)。没有太大需要将更新分解成微小的部分。但当然,尝试通过保留“最新更新”的更详细信息来最小化传输的数据量并不会造成什么影响。

(绝对应该使用JSON而非XML作为传输的数据表示。)

0

不知道你是否使用同步框架来管理同步考虑。如果您有兴趣,可以看看OpenMobster的Sync服务。你可以做以下的同步操作

  • 双向
  • 单向客户
  • 单向设备
  • 启动时

除此之外,所有的修改都自动跟踪并已同步与云。网络连接断开时,您可以让应用程序脱机。它将跟踪所有更改,并在连接返回时自动在后台将其与云同步。它还提供跨多个设备的iCloud同步

此外,使用推送通知同步云中的修改,因此即使数据存储在本地也始终为当前数据。

在你的情况,

Criteria are speed (less network data exchange), robustness (data recovery in case update fails), offline access 
  • 速度:只有变化是在两个方向上

  • 健壮性通过网络发送的:它在事务店像SQLite和任何失败的存储数据更新在SyncML有效载荷中传递。只有成功的操作处理,而失败的操作将在下次同步

这期间重新尝试是对开源项目的链接:http://openmobster.googlecode.com

这里是一个iPhone应用程序同步链接:http://code.google.com/p/openmobster/wiki/iPhoneSyncApp

相关问题