CoreData:错误:无法调用NSManagedObject类上的指定初始值设定项

我有一个与CoreData一个该死的问题。 我想插入一个新的对象,所以我首先必须创build一个。 这是由该代码完成的:

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初始化后,我得到这个错误:

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

黑客出了什么问题?

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

 initWithEntity:insertIntoManagedObjectContext: 

代替

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

阅读更多..

如果你问自己“好的,那么我怎样才能得到那个实体?” (就像我做的那样),你可以通过使用entityForName方法来做到这一点:

 NSEntityDescription *entity = [NSEntityDescription entityForName:@"Challenges" inManagedObjectContext:self.managedObjectContext]; Challenges *newChallenge = [[Challenge alloc] initWithEntity:entity insertIntoManagedObjectContext:self.managedObjectContext]; 

希望这有助于,这个线程已经帮了我很多!

NSManagedObject不能像通常用NSObject那样只是alloc / init 。 实际上,指定的初始化器是: initWithEntity:insertIntoManagedObjectContext:

现在,对于实际的错误,苹果在文档中指出:

重要说明 :此方法是NSManagedObject的指定初始值设定项。 您不能简单地通过发送init来初始化pipe理对象。

所以,你可以看到你需要2件东西来初始化它,一个NSEntityDescription (你打算实例化的实体)和一个NSManagedObjectContext (创build新对象的上下文)。

其他人已经说明了为什么它不工作。 这里是如何减less样板,让你的代码更具可读性:

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

现在你可以这样做:

 Challenges *newChallenge = [Challenge insertNewObjectInContext:context]; 

另外,如果你的挑战类是NSManagedObject和date,轮次和镜头被定义为它的属性,你可以添加方法:

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

每个新的对象将从其出生时定义这些属性。