2016-03-02 34 views
0

我目前正在使用合奏來測試核心數據光線遷移。合奏和核心數據光線遷移

我的當前配置是如下:

  • 設備-A運行我與數據模型應用程序1
  • 設備-B運行我與數據模型應用2
  • 數據模型2是基於數據模型以與一個額外的字符串屬性,這是可選

我的方案是如下:

  • 開始時,在Device-A和Device-B上使用數據模型1運行我的應用程序,所有事情都使用Ensembles(iCloud配置)同步正常
  • 在Device-B上,使用數據安裝並運行更新的應用程序型號2
  • 在Device-A上,使用數據模型1繼續運行我的舊應用程序,並添加新記錄
  • 結果:在Device-A上添加的新記錄上載到iCloud,然後同步到設備-B

我的問題:我可以配置Ensembles以防止它將更改上載到iCloud,以防相關數據m奧德爾不是最新的? (即在我的情況下,Device-A基於數據模型1上傳對象,而iCloud已經基於數據模型2)

在此先感謝!

UPDATE 1:

德魯,非常感謝您的回答。我絕對同意上傳不能(也可能不應該)被阻止,因爲Ensembles是一個分散式的點對點系統。

在理想情況下,我希望帶有新數據模型的設備將忽略基於舊數據模型的數據。 (與現有的行爲類似,具有舊數據模型的設備將忽略基於新數據模型的任何數據)。是否支持?

如果沒有,請考慮下面的情況爲例:

  • 舊的數據模型有兩個屬性被稱爲「書」實體:標題和作者(這兩個領域都是非可選)
  • 新的數據模型有一個名爲titleFirstLetter的新的可選屬性,它應該包含標題字段的第一個字母。

當前,當不涉及Ensembles時,我將完全控制權保存到持久性存儲中的新NSManagedObject。因此,我負責添加新書的應用程序的更新代碼將確保從標題字段中提取第一個字母並將其保存到新的titleFirstLetter屬性中。 (即當書籍被保存時,名爲Catch-22的書將在titleFirstLetter屬性中具有C)。

另外,當在覈心數據堆棧上發生輕度遷移時,我會檢測並執行一次性過程,在該過程中我遍歷數據庫中的所有現有書籍,並根據標題值設置titleFirstLetter。從這一點開始,數據庫是一致且有效的,而新的代碼將確保未來添加到數據庫的書籍將保持數據庫的有效性。

關於Ensembles,如果我無法控制舊數據來自舊數據模型的設備,那麼如果我的代碼永遠不會被調用,如何填充titleFirstLetter的新屬性?

謝謝你的協助!

回答

1

你不能阻止它,沒有。 Ensembles是一個分散式的點對點系統。一臺設備真的無法知道另一臺設備的當前狀態,因此您無法阻止上傳。

更新後的設備應該能夠處理來自其他設備的舊數據。具有舊型號的設備將忽略基於新型號的任何數據,直到其更新。然後它會合並所有被忽略的數據。

最好儘量避免遷移,並堅持簡單的東西,如添加屬性或實體,而不是棘手的重構。如果您需要進行大量更改,請考慮從一個新的集合開始(例如,更改集合標識符)。

+0

德魯,非常感謝您的回答!請參閱我的原始問題上的更新1。 – Joshua

+0

你的代碼確實被調用。有很多代表方法。您可以查看合併後委託方法或合併完成塊中的更改,並應用您的特殊更改。 –

+0

你說得對。我剛剛意識到persistentStoreEnsemble:didSaveMergeChangesWithNotification:將完全針對我需要的內容。謝謝你指點我正確的方向! – Joshua