2013-03-18 116 views
0

我想在運行時將表/列添加到數據庫。 目前我正在使用核心數據。 我知道在XCode中可以這樣做(添加新的數據模型版本),但我絕對不能以這種方式使用,因爲我從Web服務接收數據庫模式。iOS:DDL運行時命令

在運行時使用Core Data時是否有很好的可能性運行ddl命令,或者直接使用sqlite(或者wrapper/ormapper)可以嗎? 如果最好使用包裝器或者映射器,請給我一些關於在這種情況下應該使用哪些內容的建議。

工作流程應該是:

  1. 開始應用
  2. 如果檢查數據庫是最新的
  3. 如果模式的新版本可從Web服務做DDL命令
  4. 繼續與應用程序的工作流程

PS:請不要回答描述用XCode修改架構的替代方案!

+0

是否要修改Core Data使用的數據模型或其他內容?你說「數據庫」這聽起來像你的意思是核心數據以外的東西,但目前尚不清楚。 – 2013-03-18 16:21:36

+0

對不起,是的,我想修改核心數據模型 – user2181824 2013-03-26 15:49:39

回答

1

您可以在運行時修改Core Data模型嗎?是的,但是,它可能無法按照您希望的方式工作。

核心數據的API可以在運行時構建或修改數據模型的每個細節。 Xcode的模型編輯器很方便,但是如果你願意,你可以跳過它並用代碼完成所有的事情。例如,NSEntityDescriptionproperties屬性(它涵蓋了屬性和關係)是可寫的。您可以創建一個新的NSAttributeDescription並更新實體的屬性以包含它。 Bang,你剛剛給實體添加了一個新的屬性。同樣,NSManagedObjectModelentities屬性是可寫的,因此您可以創建一個新的NSEntityDescription並將其添加到模型中。這給你一個新的實體,在運行時創建。

,這是一個很大的一個:您可以在加載數據存儲這個之前只能做。一旦你加載你的持久化存儲,改變模型會拋出一個異常。當Core Data加載持久性存儲時,它將模型文件與存儲文件中使用的模型進行比較。他們必須匹配,並且您無法在加載商店後做任何事情來改變這一事實。一旦你加載商店,模型是固定的。更重要的是,即使您在加載持久性存儲之前修改模型,您也只能加載與當前版本的模型相匹配的持久性存儲 - 除非您也編寫代碼將持久存儲遷移到新模式。這很難取決於變化的性質。至少在加載先前保存的數據之前,您需要進行任何更改,然後安排進行模型遷移以更新持久性存儲以使用新模型。

使用核心數據時,模型(模式)和數據分開存儲並在商店加載時進行匹配。這不是SQLite如何在內部工作,而是核心數據強制執行的方式。