2010-09-28 32 views
2

我的應用程序解析來自遠程服務器的XML並將對象存儲在覈心數據(SQLite存儲)中。因此,該用戶可以通過從本地存儲讀取來在OFFLINE時瀏覽資料。將iOS核心數據與發送XML的遠程服務器同步

用戶可以在脫機瀏覽時對對象進行更改,並將其存儲在本地Core Data SQLite存儲中。另一位用戶對遠程服務器上的對象進行了一些更改,並將其存儲在此處。現在當我檢測到互聯網連接時,我的應用程序應該將本地存儲與遠程服務器同步。這意味着遠程服務器在我離線時對我的Core Data(SQLite存儲)所做的更改進行更新,並且我的本地存儲 - Core Data(SQLite存儲)需要更新其他用戶對遠程服務器所做的更改。

例如有一個論壇,它存儲在我的本地存儲中,以便我可以在旅行時閱讀和回覆。當後來互聯網可以訪問。我的應用程序應該會自動將我的所有回覆存儲在覈心數據中,並將遠程服務器上的其他帖子導入到本地存儲中。

遠程服務器發送我正在解析並存儲在Coredata中的XML。 我的問題是如何同步它? 兩種溝通方式如何發生變化? 如何僅同步已更改的數據,而不同步導入整個遠程服務器數據庫,反之亦然?

回答

0

一種解決方案可能是

  • iphone同步的變化
  • 服務器合併新和舊的東西
  • 在iPhone上(從合併)從服務器的新變化,服務器

因此,讓服務器成爲應該知道如何合併東西的主人,並且客戶端應該只是在一些更改後遞增地下載數據。

+0

非常感謝Kiran和brutella。試圖實現它,看看它是如何工作的。 – Ravi 2010-09-29 06:25:57

2

我知道做到這一點的方法之一..

  1. 多一個字段添加到您的本地和服務器數據庫。即時間戳。
  2. 當用戶更改本地數據庫上的數據時,會將時間戳更改爲當前時間。 在服務器..i.e上做同樣的事情。當有人編輯服務器上的數據時,會將Timestamp更改爲當前時間。
  3. 當用戶連接到互聯網...檢查本地時間戳到服務器時間戳.. 情況1兩者都是一樣的 - 無事可做 情況2本地時間>服務器時間 - 使用sql獲取所有數據的時間戳大於服務器時間戳..並上傳到服務器上... 情況下,3個當地<服務器....讓所有的記錄比本地時間戳更大,並將其添加到本地數據庫..

我不知道如果有什麼更好的辦法......但這肯定有效......

0

交易。您想遵循ACID交易規則。基本上你必須確保沒有更新你在本地寫入更新之前沒有刷新的數據。

所以最簡單的方法是讓用戶從服務器獲取最新的更新,然後覆蓋該更新,並確保在時間戳過程中不會發生其他更新。更好的是,使用線程阻塞來確保沒有其他事情發生。

如果您的Google交易或ACID會有很多信息。在RDBMS環境中,這是一個很大的領域,許多用戶可能會破壞數據,鎖定必須在寫入和更新之間進行。

相關問題