2009-08-12 160 views
4

我正在构建iPhone应用程序/ Web应用程序,并试图通过最佳方式来实现数据库的双向同步。我可能会使用iPhone上的sqlite和web上的mysql(因为这是我所知道的),但我不确定如何处理它们保持同步。将移动(iPhone)应用程序与网络应用程序同步

下面是一个示例模式:

index_id的(自动增量)|标题|数额| user_id |创建(日期时间)

Similar thread

回答

2

这是一个问题,因为你必须处理像某些情况下。 A =服务器,B = iPhone

A - Adds new entry 
B - Adss new entry 
A - Get B's entry 
B - Get A's entry 
A - Update entry 
B - Delete A's entry 

(哪一个你使用,你同步在变化到B是A做还是你删除一个做B上的项目?)

同步部分可以是一个简单的推/拉风格的http请求,这是如何妥善保持它们同步的后勤问题,引起关注。

对于如何:只要iPhone检查服务器页面(update.php)的任何更改随着它的变化。使用iPhone发送的更改更新服务器,并使用请求发回的任何更改(使用JSON或XML)更新iPhone。

+0

我同意你的做法 - 你如何监控这些变化?如果两个数据库都有自动增量的ID,那么你如何比较这两个数据?理论上,一行中唯一唯一的部分是index_id(在实践中创建的可能是唯一的),但是您可以有两个条目,一个在电话上,另一个在服务器上,具有相同的标题/金额/ user_id。你怎么知道要同步什么和单独离开? – thekevinscott 2009-08-12 14:12:45

0

为什么不让您的Web应用程序为您的iPhone客户端提供安全/经过身份验证的Web服务?例如,iPhone会与此服务进行通信(使用JSON,XML,SOAP等),而您只需维护一个数据库。

+0

这绝对是一种可能性,但我想为iPhone应用程序提供离线访问(地下),从而实现同步。 – thekevinscott 2009-08-12 14:10:30

5

好吧,我已经对如何处理这两个后续的想法,认为这会是一个答案比编辑好:

1)你有两个数据库,一个用于手机和一个用于Web应用程序。该模式是这样的:

index_id | title | amount | user_id | created | environment | foreign_id 

所以我们可以说我有我的移动设备上的条目:1,“标题”,2.00,1,NOW(),并在我的web应用程序,1项,” Something',5.00,1,NOW()。为了避免这两件事情发生冲突,Web应用程序将添加一行,标题为2,'Title',2.00,1,NOW(),'mobile',1。

以这种方式,我可以正确维护所有的index_id。这似乎是维持和保持正确的绝对噩梦。

2)如果您将一个数据库(称为网络应用程序)指定为主设备,将设备指定为从设备,那么您在网络应用程序和设备上有两个表格。对于该设备,您将有一个表“队列”,在网络连接时,它将更新实时Web应用程序数据库(同时清除自己),然后WEB应用程序数据库将同步,返回到该设备的第二个主表。

在同步之前,设备上的业务逻辑必须将两个本地表视为一个。这似乎是一个比上述更容易解决的野兽。

+0

这似乎是其中PK(非常罕见)的情况下,PK的GUID是有帮助的。 – jcollum 2009-08-12 18:06:23

+0

我觉得2)真的是唯一的出路。你需要你的一个数据库“永远是正确的”,另一个是“可能是正确的”。手机“可能是正确的”,并与主数据库进行交谈,看看它是否正确。如果它未连接,则它会在本地保存其更改并将它们标记为NeedsUpload。 SQLite都是一个选项。 SQLite适用于任何每天点击次数低于10万次的站点。我会从那里开始,稍后再迁移到MySQL。 – jcollum 2009-08-12 18:09:16

+0

@jcollum,你的缩写会飞过我的头。你能否详细说明/提供一些链接? 除了有两个独立的表格之外,还有更好的方法来实现解决方案2吗?或者是最干净的解决方案? – thekevinscott 2009-08-12 20:17:06

2

只需在两个位置复制模式,并在每个表的每一行中投掷一个时间戳。然后让客户端发送最新的时间戳,并让服务器返回比它更新的行。

最简单的方法...

+1

owkay删除什么? – 2011-08-04 21:19:40

+0

在这种方法中,您将永远保持该行,并将删除标记为“无效”,以便继续同步。如果您经常更新数据,那么您可能会感到臃肿,或者您可能不得不清除比特定时间段更早的条目。 – 2014-09-02 17:37:56