2011-03-17 85 views
5

我想在SQLite中創建一個新的實體(表)。我的代碼如下:如何通過CoreData模型創建一個新的實體(表)?

+(BOOL)CreateDataSet:(NSManagedObjectModel *) model 
    attributes:(NSDictionary*)attributes 
    entityName:(NSString*) entityName 
{ 
    NSEntityDescription *entityDef = [[NSEntityDescription alloc] init]; 

    [entityDef setName:entityName]; 
    [entityDef setManagedObjectClassName:entityName]; 
    [model setEntities:[NSArray arrayWithObject:entityDef]]; 
    NSArray *properties = [CoreDataHelper CreateAttributes:attributes]; 
    [entityDef setProperties:properties]; 

    [entityDef release]; 

    return TRUE; 
} 

但它引發的錯誤:

 
Terminating app due to uncaught exception 'NSInternalInconsistencyException', 
reason: 'Can't modify an immutable model.' 
*** Call stack at first throw: 
(
    0 CoreFoundation      0x01c5abe9 __exceptionPreprocess + 185 
    1 libobjc.A.dylib      0x01daf5c2 objc_exception_throw + 47 
    2 CoreData       0x0152634a -[NSManagedObjectModel(_NSInternalMethods) _throwIfNotEditable] + 106 
    3 CoreData       0x01526904 -[NSManagedObjectModel setEntities:] + 36 
.... 

這似乎表明,該模型是隻讀的。

+1

警告:核心數據不是SQL。實體不是表格。對象不是行。列不是屬性。核心數據是一個對象圖管理系統,它可能會或可能不會持久化對象圖,並且可能會或可能不會在後臺使用SQL來做到這一點。試圖用SQL語言來思考覈心數據會導致你完全誤解核心數據,並導致很多悲傷和浪費時間。 – TechZen 2011-03-17 19:54:23

回答

2

我引述蘋果的文檔描述很準確:直到 它們是由一個對象圖 管理器使用

實體的描述進行編輯。這允許您創建或動態修改它們。但是,一旦使用 (當其所屬的受管對象模型與 持久性存儲區協調器相關聯時),它必須不是(實際上不能)更改,而是必須 。這 強制執行運行時:任何企圖 變異的模型後,模型或任何其 子對象與持久性存儲 協調相關 導致異常被拋出 。如果您需要修改正在使用的型號 ,請創建副本,修改 副本,然後丟棄舊型號的對象 。

+0

我們如何用新創建的模型替換舊模型? – 2017-11-10 08:51:42

6

From the documentation:(重點是我的),直到它們被一個對象圖 管理器(管理對象上下文或 持久存儲協調器)中使用

管理對象模型是可編輯的 。這 允許您動態地創建或修改它們 。但是,一旦使用型號 ,則不得更改。 這是在運行時強制執行的 - 當對象管理器首次使用模型提取數據 時,整個模型 變得不可編輯。任何嘗試 變異模型或其任何 子對象後,該點導致 異常被拋出。 如果您需要修改正在使用的模型,請創建 副本,請修改副本,,然後使用 模型丟棄對象。

+0

但如何?我嘗試新模型,並使用NSPersistentStoreCoordinator方法'addPersistentStoreWithType:配置:URL:選項:錯誤'保存模型作爲新的SQLite文件,但失敗...... – iXcoder 2011-03-18 09:47:41

2

從文檔NSManagedObjectModel

編輯模型編程

管理對象模型是可編輯的 ,直到它們被使用的對象圖 管理器(管理對象上下文或 持久性商店協調員)。這 允許您動態地創建或修改它們 。但是,一旦使用型號 ,則不得更改。 這是在運行時強制執行的 - 當對象管理器首次使用模型提取數據 時,整個模型 變得不可編輯。任何嘗試 變異模型或其任何 子對象後,該點導致 異常被拋出。如果您需要 修改正在使用的模型,請創建 副本,修改副本,然後使用 模型廢棄對象。

換句話說,在設置持久性存儲協調器或託管對象上下文之前編輯託管對象模型。

+0

嗨,可能會顯示一些代碼爲此目的?十分感謝 – iXcoder 2011-03-18 15:40:30

0

如果你想動態地創建實體,請試試忽略CoreData,試試SQLite(請使用神奇的FMDB庫),它不會讓你失望。

請注意,SQLite/FMDB不支持iCloud。