我对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'
黑客出了什么问题?
答案 0 :(得分:60)
我认为问题是挑战是一个NSManagedObject
类,你需要指定的初始化程序:
initWithEntity:insertIntoManagedObjectContext:
而不是
Challenges *newChallenge = [[Challenges alloc] init];
答案 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];