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); }
每个新的对象将从其出生时定义这些属性。