39

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'

ハックがうまくいかないのは何ですか?

4

5 に答える 5

60

問題は、ChallengesがNSManagedObjectクラスであり、指定された初期化子が必要なことだと思います。

initWithEntity:insertIntoManagedObjectContext:

それ以外の

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

続きを読む..

于 2013-02-03T10:34:39.187 に答える
30

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

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

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

これが役立つことを願っています、このスレッドは私を大いに助けてくれました!

于 2013-06-13T01:16:58.810 に答える
14

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

さて、実際のエラーについて、Appleはドキュメントで次のように述べています。

重要:このメソッドは、NSManagedObjectの指定された初期化子です。単にinitを送信するだけで管理対象オブジェクトを初期化してはなりません。

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

于 2013-02-03T10:36:20.577 に答える
4

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

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

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

于 2013-02-03T12:35:19.713 に答える
4

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

@implementation NSManagedObject(MyPrivateAdditions)

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

@end

今、あなたはできる:

Challenges *newChallenge = [Challenge insertNewObjectInContext:context];
于 2013-08-14T00:58:29.807 に答える