我是否可以在不通过NSEntityDescription的情况下创建自定义托管对象类的新实例?

时间:2010-01-25 15:42:58

标签: iphone cocoa cocoa-touch core-data macos

从Apple的例子来看,我有这个:

Event *event = (Event*)[NSEntityDescription 
    insertNewObjectForEntityForName:@"Event" 
             inManagedObjectContext:self.managedObjectContext];

Event继承自NSManagedObject。有没有办法避免这种奇怪的NSEntityDescription调用,而只是alloc+init以某种方式直接Event类?我是否必须编写自己的初始化程序才能执行上述操作?或者NSManagedObject已经足够聪明了吗?

4 个答案:

答案 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]];

不是类别盛大吗?