CoreData:错误:无法在NSManagedObject类上调用指定的初始化程序

时间:2013-02-03 10:23:49

标签: objective-c core-data initializer

我对CoreData有点问题。我想插入一个新的Object,所以我首先要创建一个。这是由该代码完成的:

Challenges *newChallenge = [[Challenges alloc] init];
[newChallenge setName:@"TestChallenge"];
[newChallenge setRounds:[[NSNumber alloc] initWithInt:12]];
[newChallenge setShots:[[NSNumber alloc] initWithInt:5]];
[newChallenge setDate:[NSDate date]];

但是在alloc init之后我得到了这个错误:

CoreData: error: Failed to call designated initializer on NSManagedObject class 'Challenges'

黑客出了什么问题?

5 个答案:

答案 0 :(得分:60)

我认为问题是挑战是一个NSManagedObject类,你需要指定的初始化程序:

initWithEntity:insertIntoManagedObjectContext:

而不是

Challenges *newChallenge = [[Challenges alloc] init];

Read More..

答案 1 :(得分:30)

如果您问自己“好的,那么如何获得该实体?” (就像我一样),你通过使用entityForName方法这样做:

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Challenges" inManagedObjectContext:self.managedObjectContext];

Challenges *newChallenge = [[Challenge alloc] initWithEntity:entity insertIntoManagedObjectContext:self.managedObjectContext];

希望这有帮助,这个帖子对我帮助很大!

答案 2 :(得分:13)

NSManagedObject不能像通常使用alloc一样init / NSObject。事实上,指定的初始化程序是: initWithEntity:insertIntoManagedObjectContext:

现在,对于实际错误,Apple states in the documentation表示:

  

重要:此方法是指定的初始化程序   NSManagedObject。您不能简单地初始化托管对象   发送它。

所以,你可以看到你需要2件事来初始化它,NSEntityDescription(你打算实例化哪个实体)和NSManagedObjectContext(新对象将被创建的上下文)成)。

答案 3 :(得分:4)

另外,如果您的Challenges类是NSManagedObject并且日期,轮次和镜头被定义为其属性,您可以添加方法:

-(void) awakeFromInsert {
     self.date = [NSDate date];
     self.rounds = @(12);
     self.shots = @(5);
}

每个新对象都会从出生时就定义这些属性。

答案 4 :(得分:4)

其他人已经说明了为什么它不起作用。以下是如何减少样板并使代码更具可读性的方法:

@implementation NSManagedObject(MyPrivateAdditions)

+ (id)insertNewObjectInContext:(NSManagedObjectContext *)context
{
    return [NSEntityDescription insertNewObjectForEntityForName:self.className inManagedObjectContext:context];
}

@end

现在你可以这样做:

Challenges *newChallenge = [Challenge insertNewObjectInContext:context];