从Apple的例子来看,我有这个:
Event *event = (Event*)[NSEntityDescription
insertNewObjectForEntityForName:@"Event"
inManagedObjectContext:self.managedObjectContext];
Event
继承自NSManagedObject
。有没有办法避免这种奇怪的NSEntityDescription调用,而只是alloc+init
以某种方式直接Event
类?我是否必须编写自己的初始化程序才能执行上述操作?或者NSManagedObject
已经足够聪明了吗?
答案 0 :(得分:5)
NSManagedObject
提供了一种名为initWithEntity:insertIntoManagedObjectContext:
的方法。您可以使用它来执行更传统的alloc
/ init
对。请记住,返回的对象是而不是自动释放。
答案 1 :(得分:3)
我遇到了完全相同的问题。事实证明,您可以完全创建一个实体,而不是先将其添加到商店,然后对其进行一些检查,如果一切正常,请将其插入商店。我在XML解析会话期间使用它,我只想在实体和完全解析后插入实体。
首先,您需要创建实体:
// This line creates the proper description using the managed context and entity name.
// Note that it uses the managed object context
NSEntityDescription *ent = [NSEntityDescription entityForName:@"Location" inManagedObjectContext:[self managedContext]];
// This line initialized the entity but does not insert it into the managed object context.
currentEntity = [[Location alloc] initWithEntity:ent insertIntoManagedObjectContext:nil];
然后,一旦您对处理感到满意,您只需将实体插入商店即可:
[self managedContext] insertObject:currentEntity
请注意,在这些示例中,currentEntity对象已在头文件中定义,如下所示:
id currentEntity
答案 2 :(得分:1)
为了让它正常工作,有很多事情要做。 -insertNewObject:...是迄今为止最简单的方法,奇怪与否。 The documentation说:
托管对象与其他对象不同 三种主要方式的对象 - 托管 对象...存在于环境中 由其托管对象上下文定义 ......因此有很多工作要做 要创建一个新的托管对象 并将其正确地整合到 核心数据基础设施......你是 不鼓励压倒一切 initWithEntity:insertIntoManagedObjectContext:
那就是说,你仍然可以这样做(在我链接的页面下方进一步阅读),但你的目标似乎是“更容易”或“不那么奇怪”。我会说你觉得奇怪的方法实际上是最简单,最正常的方式。
答案 3 :(得分:1)
我从Dave Mark和Jeff LeMarche的 More iPhone 3 Development 中找到了明确的答案。
如果您使用NSEntityDescrpiton
上的方法而不是NSManagedObjectContext
上的方法将新对象插入NSManagedObjectContext
确实困扰您,您可以使用类别向NSManagedObjectContext
添加实例方法。
创建两个名为 NSManagedObject-Insert.h 和 NSManagedObject-Insert.m 的新文本文件。
在 NSManagedObject-Insert.h 中,输入以下代码:
import <Cocoa/Cocoa.h>
@interface NSManagedObjectContext (insert)
- (NSManagedObject *)insertNewEntityWithName:(NSString *)name;
@end
在 NSManagedObject-Insert.m 中,放置此代码:
#import "NSManagedObjectContext-insert.h"
@implementation NSManagedObjectContext (insert)
- (NSManagedObject *)insertNewEntityWithName:(NSString *)name
{
return [NSEntityDescription insertNewObjectForEntityForName:name inManagedObjectContext:self];
}
@end
您可以在希望使用此新方法的任何位置导入 NSManagedObject-Insert.h 。然后替换NSEntityDescription
的插入调用,如下所示:
NSManagedObject *newManagedObject = [NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:context];
更短更直观的一个:
[context insertNewEntityWithName:[entity name]];
不是类别盛大吗?