2013-02-03 22 views
36

CoreDataに少し問題があります。私は新しいオブジェクトを挿入したいので、まずオブジェクトを作成しなければなりません。CoreData:error:NSManagedObjectクラスの指定された初期化子を呼び出すことができませんでした。

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' 

ハックが間違って起こっていますか?

答えて

58

私はこの問題は、課題がNSManagedObjectクラスであるということだと思う、あなたは指定イニシャライザが必要です

initWithEntity:insertIntoManagedObjectContext: 

代わりの

Read More..

+1

私はあなたが意味するものだと思う*初期化子*指定されました。 – jlehr

+1

@jiehr:もちろん、私は指定された初期化子を意味しました - 多くのありがとう! (私は答えを編集しました) – duDE

13

NSManagedObject

Challenges *newChallenge = [[Challenges alloc] init]; 
がちょうど alloc/ initすることはできませんあなたは通常でやっているように。実際のところ指定イニシャライザがあるので: 今 initWithEntity:insertIntoManagedObjectContext:

、実際のエラーのため、アップルstates in the documentation:だから

Important: This method is the designated initializer for NSManagedObject. You must not initialize a managed object simply by sending it init.

は、あなたがそれを初期化するために2つのことが必要であることを見ることができ、 NSEntityDescription(インスタンス化しようとするエンティティ)とNSManagedObjectContext(新しいオブジェクトが作成されるコンテキスト)が含まれます。それぞれの新しいオブジェクトは、その誕生からそれらの属性を定義しています

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

:あなたの挑戦クラスはNSManagedObjectと日付であれば

4

Additionaly、ラウンドとショットは、あなたがメソッドを追加することができ、その属性として定義されています。

30

自分自身に「OK、どうすればそのエンティティを取得できますか? (私が行ったように)、あなたはとても似entityForNameメソッドを使用して次の操作を行います。このことができます

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

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

希望は、このスレッドは私をたくさん助けました!

+0

それは私のために働くが、なぜ? – Allan

4

他の人は、なぜそれが動作しないのかについて既に述べています。ここでは、定型的に削減し、コードをより読みやすくすることができる方法である。

@implementation NSManagedObject(MyPrivateAdditions) 

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

@end 

今あなたが行うことができます:

Challenges *newChallenge = [Challenge insertNewObjectInContext:context]; 
+0

これは受け入れられる回答である必要があります –

関連する問題