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'
ハックは何が悪いのでしょうか?
問題は、チャレンジがNSManagedObject
クラスであり、指定された初期化子が必要だと思うことです。
initWithEntity:insertIntoManagedObjectContext:
の代わりに
Challenges *newChallenge = [[Challenges alloc] init];
「OK、それではどのようにしてそのエンティティを取得するのですか?」 (私がしたように)、次のようにentityForNameメソッドを使用してこれを行います。
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Challenges" inManagedObjectContext:self.managedObjectContext];
Challenges *newChallenge = [[Challenge alloc] initWithEntity:entity insertIntoManagedObjectContext:self.managedObjectContext];
これがお役に立てば幸いです。このスレッドが私を大いに助けてくれました!
NSManagedObject
は、alloc
で通常行うように、単にinit
/NSObject
にすることはできません。実際のところ、指定された初期化子は次のとおりです:initWithEntity:insertIntoManagedObjectContext:
さて、実際のエラーについては、Apple ドキュメントの状態
Important:このメソッドは、NSManagedObjectの指定された初期化子です。 initを送信するだけで管理対象オブジェクトを初期化しないでください。
したがって、それを初期化するには、NSEntityDescription
(インスタンス化するエンティティ)とNSManagedObjectContext
(新しいオブジェクトが作成されるコンテキスト)の2つのものが必要であることがわかります。 )。
他の人は、なぜ機能しないのかをすでに述べています。ボイラープレートを削減してコードを読みやすくする方法は次のとおりです。
@implementation NSManagedObject(MyPrivateAdditions)
+ (id)insertNewObjectInContext:(NSManagedObjectContext *)context
{
return [NSEntityDescription insertNewObjectForEntityForName:self.className inManagedObjectContext:context];
}
@end
今できること:
Challenges *newChallenge = [Challenge insertNewObjectInContext:context];
さらに、チャレンジクラスがNSManagedObjectであり、日付、ラウンド、ショットがその属性として定義されている場合、メソッドを追加できます。
-(void) awakeFromInsert {
self.date = [NSDate date];
self.rounds = @(12);
self.shots = @(5);
}
新しいオブジェクトはそれぞれ、その誕生からそれらの属性を定義しています。