我正在構建iPhone應用程序/ Web應用程序,並試圖通過最佳方式來實現數據庫的雙向同步。我可能會使用iPhone上的sqlite和web上的mysql(因爲這是我所知道的),但我不確定如何處理它們保持同步。將移動(iPhone)應用程序與網絡應用程序同步
下面是一個示例模式:
index_id的(自動增量)|標題|數額| user_id |創建(日期時間)
我正在構建iPhone應用程序/ Web應用程序,並試圖通過最佳方式來實現數據庫的雙向同步。我可能會使用iPhone上的sqlite和web上的mysql(因爲這是我所知道的),但我不確定如何處理它們保持同步。將移動(iPhone)應用程序與網絡應用程序同步
下面是一個示例模式:
index_id的(自動增量)|標題|數額| user_id |創建(日期時間)
這是一個問題,因爲你必須處理像某些情況下。 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。
爲什麼不讓您的Web應用程序爲您的iPhone客戶端提供安全/經過身份驗證的Web服務?例如,iPhone會與此服務進行通信(使用JSON,XML,SOAP等),而您只需維護一個數據庫。
這絕對是一種可能性,但我想爲iPhone應用程序提供離線訪問(地下),從而實現同步。 – thekevinscott 2009-08-12 14:10:30
好吧,我已經對如何處理這兩個後續的想法,認爲這會是一個答案比編輯好:
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應用程序數據庫將同步,返回到該設備的第二個主表。
在同步之前,設備上的業務邏輯必須將兩個本地表視爲一個。這似乎是一個比上述更容易解決的野獸。
這似乎是其中PK(非常罕見)的情況下,PK的GUID是有幫助的。 – jcollum 2009-08-12 18:06:23
我覺得2)真的是唯一的出路。你需要你的一個數據庫「永遠是正確的」,另一個是「可能是正確的」。手機「可能是正確的」,並與主數據庫進行交談,看看它是否正確。如果它未連接,則它會在本地保存其更改並將它們標記爲NeedsUpload。 SQLite都是一個選項。 SQLite適用於任何每天點擊次數低於10萬次的站點。我會從那裏開始,稍後再遷移到MySQL。 – jcollum 2009-08-12 18:09:16
@jcollum,你的縮寫會飛過我的頭。你能否詳細說明/提供一些鏈接? 除了有兩個獨立的表格之外,還有更好的方法來實現解決方案2嗎?或者是最乾淨的解決方案? – thekevinscott 2009-08-12 20:17:06
只需在兩個位置複製模式,並在每個表的每一行中投擲一個時間戳。然後讓客戶端發送最新的時間戳,並讓服務器返回比它更新的行。
最簡單的方法...
owkay刪除什麼? – 2011-08-04 21:19:40
在這種方法中,您將永遠保持該行,並將刪除標記爲「無效」,以便繼續同步。如果您經常更新數據,那麼您可能會感到臃腫,或者您可能不得不清除比特定時間段更早的條目。 – 2014-09-02 17:37:56
我同意你的做法 - 你如何監控這些變化?如果兩個數據庫都有自動增量的ID,那麼你如何比較這兩個數據?理論上,一行中唯一唯一的部分是index_id(在實踐中創建的可能是唯一的),但是您可以有兩個條目,一個在電話上,另一個在服務器上,具有相同的標題/金額/ user_id。你怎麼知道要同步什麼和單獨離開? – thekevinscott 2009-08-12 14:12:45