NSEntityDescription 创建方法的区别
Posted
技术标签:
【中文标题】NSEntityDescription 创建方法的区别【英文标题】:Difference between NSEntityDescription creation methods 【发布时间】:2014-01-30 12:17:09 【问题描述】:就结果而言,以下两种方法有什么区别:
+ (id)insertNewObjectForEntityForName:(NSString *)entityName inManagedObjectContext:(NSManagedObjectContext *)context;
+ (NSEntityDescription *)entityForName:(NSString *)entityName inManagedObjectContext:(NSManagedObjectContext *)context;
我应该什么时候使用它们中的每一个?
【问题讨论】:
【参考方案1】:insertNewObjectForEntityForName
创建实体的实例并将其添加到上下文中。上下文现在很脏,需要保存。返回的实例是NSManagedObject
的子类。
entityForName
返回描述实体的NSEntityDescription
实例,它具有哪些属性和关系,以及它们是如何构造的。上下文不会以任何方式修改。
【讨论】:
【参考方案2】:insertNewObjectForEntityForName:...
返回NSManangedObject
对象,与下面的代码相同。
NSManagedObjectModel *managedObjectModel =
[[context persistentStoreCoordinator] managedObjectModel];
NSEntityDescription *entity =
[[managedObjectModel entitiesByName] objectForKey:entityName];
NSManagedObject *newObject = [[NSManagedObject alloc]
initWithEntity:entity insertIntoManagedObjectContext:context];
return newObject;
entityForName:..
返回NSEntityDescription
对象,与下面的代码相同。
NSManagedObjectModel *managedObjectModel = [[context persistentStoreCoordinator] managedObjectModel];
NSEntityDescription *entity = [[managedObjectModel entitiesByName] objectForKey:entityName];
return entity;
【讨论】:
【参考方案3】:id 变量是一种表示对象地址的数据类型。因为它只是一个地址,id可以是任何对象,因为它的类型是指针,所以不需要包含*符号
+ (id)insertNewObjectForEntityForName:(NSString *)entityName inManagedObjectContext:(NSManagedObjectContext *)context;
因为 * 符号表示指向特定类型的指针。
+ (NSEntityDescription *)entityForName:(NSString *)entityName inManagedObjectContext:(NSManagedObjectContext *)context;
【讨论】:
以上是关于NSEntityDescription 创建方法的区别的主要内容,如果未能解决你的问题,请参考以下文章
核心数据 NSEntityDescription.entityForName 返回 nil,但 managedObjectModel.entities 列出了实体
Mac OS X 中缺少 NSEntityDescription setCompoundIndexes
OCMock - 试图模拟 NSEntityDescription