如何通过CoreData模型创build一个新的实体(表)?

我想在SQLite中创build一个新的实体(表)。 我的代码如下:

+(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; } 

但它会引发错误:

由于未捕获exception“NSInternalInconsistencyException”而终止应用程序 
理由:'不能修改一个不可变的模型。
第一次投掷时调用堆栈:
 (
     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
 ....

这似乎表明模型是只读的。

从文档:(重点是我的)

被pipe对象模型是可编辑的,直到它们被对象图pipe理器(pipe理对象上下文或持久存储协调器)使用。 这使您可以dynamic创build或修改它们。 但是,一旦使用了模型,就不能改变。 这是在运行时强制执行的 – 当对象pipe理器首先使用模型获取数据时,整个模型变得不可编辑。 在该点之后,任何试图改变模型或其任何子对象的尝试都会引发exception。 如果需要修改正在使用的模型,请创build副本,修改副本,然后丢弃旧模型的对象。

我引用苹果公司的文档来描述它非常准确:

实体描述是可编辑的,直到它们被对象图pipe理器使用。 这使您可以dynamic创build或修改它们。 但是,一旦使用了描述(当它所属的被pipe理对象模型与持久性商店协调器相关联时),它就不能(实际上不能)被改变。 这是在运行时强制执行的: 在模型与持久性存储协调器关联后,任何试图改变模型或其任何子对象的尝试都会引发exception。 如果您需要修改正在使用的模型,请创build副本,修改副本,然后丢弃旧模型的对象。

NSManagedObjectModel的文档:

以编程方式编辑模型

被pipe对象模型是可编辑的,直到它们被对象图pipe理器(pipe理对象上下文或持久存储协调器)使用。 这使您可以dynamic创build或修改它们。 但是,一旦使用了模型,就不能改变。 这是在运行时强制执行的 – 当对象pipe理器首先使用模型获取数据时,整个模型变得不可编辑。 在该点之后,任何试图改变模型或其任何子对象的尝试都会引发exception。 如果您需要修改正在使用的模型,请创build副本,修改副本,然后丢弃旧模型的对象。

换句话说,在设置持久性存储协调器或托pipe对象上下文之前编辑您的托pipe对象模型。

如果你想dynamic创build实体,请忽略CoreData,尝试SQLite(请使用神奇的FMDB库),它不会让你失望。

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