2012-01-26 40 views
6

我正在爲正在開發的iPad應用程序設置基本同步服務。目標是讓數據在iPad應用程序的多個實例中保持一致,並在Web上擁有隻讀版本的數據,從而實現自定義解決方案。核心數據同步 - 跟蹤已刪除的對象

的電流流動是這樣的:

  • 每個實體具有「創建」,「修改」和「UUID」字段被自動核心數據
  • 同步功能,與創建的每個實體更新或上次同步日期後的修改日期被序列化爲JSON併發送到服務器
  • 服務器使用客戶端生成的UUID作爲PK保留對MySQL數據庫的任何更改(如果存在衝突,則只使用最近修改的實體作爲'真實'版本,沒有什麼特別),並將任何更新的實體發送回客戶端
  • 客戶端然後合併這些更改回其核心數據DB

這一切似乎是工作的罰款。我的問題是如何使用此方法跟蹤已刪除的對象?我猜測我可以爲每個實體添加一個'已刪除'標誌,並在客戶端刪除某些內容時設置此標誌,然後我可以使用其他同步數據將該更改推送到服務器。一旦同步完成,客戶端實際上可以刪除這些實體。我的問題是:

  • 我可以覆蓋核心數據的刪除方法來自動設置此標誌嗎?
  • 這是否需要在服務器上無限期地保留所有被刪除的實體?我們無法知道每個客戶端何時同步並實際刪除了每個實體(我目前沒有跟蹤客戶端實例)
  • 有沒有更好的方法來做到這一點?

回答

5

你如何保存帶有UUID和創建/更新/刪除字段的增量歷史記錄表,可能每個更新的版本號?因此,您保留自上次成功同步以來發生的更改的小檢查列表。

這樣,如果您刪除一個對象,則可以在增量歷史記錄表中添加一個條目,並刪除UUID並將其標記爲已刪除。與創建和更新的對象相同,您只需檢查增量表即可查看服務器需要刪除,更新,創建的項目等。您甚至可以在服務器上存儲每個修訂版以支持回滾到之前的版本未來,如果你覺得喜歡它。

我認爲修訂號碼比依靠客戶端的時鐘更好,可能會手動更改。

你可以使用的NSManagedObjectContext的insertedObjects,updatedObjects,deletedObjects方法來創建增量對象之前,每次保存過程:)

我的2美分

+0

非常感謝這一點。我已經採用了一種混合方法,就像我在問題中所描述的那樣進行同步,但現在還維護着一個已刪除對象的表格。我將期待在未來完全轉向三角洲系統。 – NathanGaskin

1

關於你提到的第二個問題:你可以設計這樣使服務器沒有按如果你願意的話,不必保留刪除的記錄。讓每個應用程序知道給定的一段數據(基於它的UUID)是否存儲在服務器上(例如,添加existsOnServer屬性或類似內容)。當在應用程序中創建新項目時,這會開始爲false,但在第一次同步到服務器後設置爲true。這樣,如果應用程序稍後嘗試同步,但未找到UUID,則可以區分這兩種情況:如果existsOnServer爲false,那麼此項目是新創建的,應該同步到服務器,但如果它是true那麼可以認爲它已經在服務器上,但現在已經被刪除,所以你可以在應用中刪除它。

我可能會反對這種方法,因爲它似乎對我更容易出錯(我想象一個數據庫或連接錯誤被錯誤地解釋爲刪除),並且在您的服務器上保留記錄通常不會有什麼大不了的,但這是可能的。由dzeikei建議的「delta-approach」可以同時使用,所以對服務器上不存在的記錄的更新表示它已被刪除,而插入不更新。

1

是否需要在服務器上保留已刪除的對象或完全取決於您的需求。您需要在本地刪除一個標誌,以標記爲同步刪除,也可能在服務器上,具體取決於您希望回退的情況。

我已經採取了幾種方式照顧這個問題。這是一個可能性:

當客戶端刪除的東西,只是標誌着它在當地被刪除和同步(在這一點你可以從核心數據清除)期間從服務器中刪除。當其他客戶端請求訪問該數據時,請發回HTTP 404,因爲您不再擁有該對象。此時客戶端可以在本地刪除實體。現在,如果客戶端請求列表中的東西,並且該對象已被刪除,那麼它只會從他返回的東西列表中丟失,因此您可以檢測並刪除它。我在客戶端通過創建一個對象ID數組來做到這一點,當我從服務器獲取響應並刪除任何沒有這些ID的本地對象時。

我們必須在服務器上刪除的領域,但只是在一些情況下回滾被意外刪除的能力。

當然,您可以將已刪除的對象返回給客戶端,以便他們知道要刪除,但是如果您不想在服務器上保留副本,則必須假設客戶端將在一段時間內全部更新幀。然後,您可以在該時間框架過期後進行垃圾回收。

雖然我不太喜歡這個解決方案。如果數據過於龐大而無法請求所有對象進行完全同步,則可以使用當前的合併策略來創建和更新,然後運行單獨的調用以檢查已刪除的項目。該呼叫可以簡單地要求客戶端應該具有的所有ID。它可以刪除那些不存在的。或者它可以發送客戶端上的所有ID並獲取要刪除的ID列表。

我想你,如果你想有一個更自以爲是的建議,提供有關數據的性質的更多細節。

1

如果你還沒有,你可以看看Cross-Platform Data Synchronization by Dan Grover。這是一篇關於同步和iOS的寫得很好的論文。

關於你的問題:

  1. 可避免刪除在覈心數據的文件,並設置了「刪除標誌」:剛更新的,而不是將其刪除該文件。您可以創建自己的「刪除」方法,實際上會調用並更新記錄上的標誌。

  2. 始終保持一個last_sync和LAST_UPDATED服務器上,並且每個客戶端上的每個記錄。通過這種方式,您可以隨時知道某人何時在任何地方進行了更改,以及該更改是否與「真相數據庫」同步。

  3. 保持跟蹤已刪除的文件是一件很難做的事,我猜最好的方法是跟蹤每張表的同步歷史,但這是一項艱鉅的任務。使用這種'真實數據庫'配置的最簡單的方法是標記這些文件,這樣,您應該將數據保存在服務器上以及客戶端上。

-3

在同步期間拖拽表間的某些記錄或刪除表中的行數據相同時。當行是不同的正確同步,我在這裏用這個代碼點擊圖片

enter image description here

+1

嗨Gulsherkhan,請不要包含代碼圖片,而是包含代碼。 – bummi