web-dev-qa-db-ja.com

CoreData:エラー:NSManagedObjectクラスの指定されたイニシャライザーの呼び出しに失敗しました

CoreDataにはちょっとした問題があります。新しいオブジェクトを挿入したいので、最初に作成する必要があります。これはそのコードによって行われます:

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'

ハックは何が悪いのでしょうか?

38
Bene

問題は、チャレンジがNSManagedObjectクラスであり、指定された初期化子が必要だと思うことです。

initWithEntity:insertIntoManagedObjectContext:

の代わりに

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

続きを読む..

60
duDE

「OK、それではどのようにしてそのエンティティを取得するのですか?」 (私がしたように)、次のようにentityForNameメソッドを使用してこれを行います。

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

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

これがお役に立てば幸いです。このスレッドが私を大いに助けてくれました!

30
Jay Versluis

NSManagedObjectは、allocで通常行うように、単にinit/NSObjectにすることはできません。実際のところ、指定された初期化子は次のとおりです:initWithEntity:insertIntoManagedObjectContext:

さて、実際のエラーについては、Apple ドキュメントの状態

Important:このメソッドは、NSManagedObjectの指定された初期化子です。 initを送信するだけで管理対象オブジェクトを初期化しないでください。

したがって、それを初期化するには、NSEntityDescription(インスタンス化するエンティティ)とNSManagedObjectContext(新しいオブジェクトが作成されるコンテキスト)の2つのものが必要であることがわかります。 )。

13
Alladinian

他の人は、なぜ機能しないのかをすでに述べています。ボイラープレートを削減してコードを読みやすくする方法は次のとおりです。

@implementation NSManagedObject(MyPrivateAdditions)

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

@end

今できること:

Challenges *newChallenge = [Challenge insertNewObjectInContext:context];
4
bernstein

さらに、チャレンジクラスがNSManagedObjectであり、日付、ラウンド、ショットがその属性として定義されている場合、メソッドを追加できます。

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

新しいオブジェクトはそれぞれ、その誕生からそれらの属性を定義しています。

4
Łukasz