19

昨日CoreDataを使い始めたばかりで、夢中になっています:( CoreDataを使用するプロジェクトを作成しました(ボックスにチェックマークを付けて-CoreDataを使用します)。エンティティを作成してから、すべてのエンティティのNSManagedObjectクラスを作成しました(エンティティの「setter」および「getter」メソッド)。

ここで、これらすべてのクラスをAppDeletegateに#インポートし、applicationDidFinishLaunchingメソッドに書き込みました。

(サブスクリプションは、アプリケーションのエンティティの1つです)

NSManagedObjectContext *context = [self managedObjectContext];
 Subscriptions *sbs = (Subscriptions *)[NSEntityDescription insertNewObjectForEntityForName:@"Subscriptions" inManagedObjectContext:context];
 [sbs setTitle:@"OK"];
 [sbs setType:@"Tag"];
 [sbs setCode:@"cars"];

 NSError *error = nil;
 if (![context save:&error]) {
  NSLog(@"Couldn't create the subscription");
 }

これを実行すると、このエラーが発生します

[NSManagedObject setTitle:]:認識されないセレクターがインスタンス0x6160550に送信されました

なぜこれが起こっているのか分かりません。助けてください!!!みなさん、よろしくお願いします!


SubscriptionsSubscriptions.hのヘッダーを追加します

@interfaceサブスクリプション:NSManagedObject {
}
@property(nonatomic、retain)NSString*タイプ;
@property(nonatomic、retain)NSDecimalNumber*読み取り;
@property(nonatomic、retain)NSString*タイトル;
@property(nonatomic、retain)NSString*コード;
@property(非アトミック、保持)NSDecimalNumber*新規;
@終わり

何も変更しませんでした。Xcodeが作成したのと同じです。

4

8 に答える 8

33

大文字の変数名は使用しないでください。ゲッターとセッターが正しく機能しない可能性があります。

データモデルからNSManagedObjectサブクラスを生成した場合、すべてが正常に機能するはずですが、@ dynamicであり、セッターはcoredataによって実装されており、既に実装されているため、合成に変更しないでください。少なくとも私にとっては、@ dynamicを@synthesizeに変更した後、coredataは空のオブジェクトを返します。

また、データモデルにクラス名を設定することを忘れないでください。

ここに画像の説明を入力してください

于 2011-01-16T15:47:50.533 に答える
12

私はこれを取得していて、プロジェクトでCleanを実行し、それを修正しました。

于 2012-04-12T18:09:56.697 に答える
4

Core Data エンティティに属性を追加し、NSManagedObjectSubclass を再作成する代わりに、気を利かせて @property と @dynamic を既存のサブクラスに手動で追加しようとしました。

それが機能しなかったので、XCode を使用してサブクラスを再作成しました。これは、このエラーが発生し始めたときです (属性の値を設定するときに「認識されないセレクターがインスタンスに送信されました」)。

そこで、XCode を使用してコア データ モデルの新しいバージョンを作成し、派生データをクリーンアップして削除し、NSManagedObject サブクラスを再作成しました。それはうまくいきました。

おそらく、新しいデータ モデルとそれに基づく新しいサブクラスを作成していたので、派生データをクリーンアップまたは削除する必要はなかったでしょうが、問題はありませんでした。

于 2013-02-07T18:48:21.740 に答える
3

考えられる 2 つの問題

これらのプロパティの .m ファイルに対応する @dynamic ブロックがあり、

大文字のプロパティを使用しないでください。コーディング規則では、少なくともコンパイラがメソッドを合成するときに、プロパティの最初の文字は小文字です。

@property (nonatomic, retain) NSString * type;.h で

@dynamic type;メートルで

のようなものになります

-(void)setType:(NSString *)atype
{
....
[self willChangeValueForKey:@"type"];
[self setPrimitiveValue:atype forKey:@"type"];
[self didChangeValueForKey:@"type"];
} 

-(NSString *)type
{
return [self primitiveValueForKey:@"type"];
}

バックグラウンドで。そのコードを見ることはできませんが。

大文字と小文字の規則は自由ですが、Cocoa では名目上キャメル キャップが標準です。Big Furry Catしかし、 becksなどのオブジェクトによく似ていますbigFurryCat。リンゴの例のスタイルに従ってください。

編集- @synthesize を @dynamic に変更

于 2010-12-28T16:00:43.980 に答える
2

エンティティとの関係を持つことで、関係の一部が多対数になるようにする必要があることがわかりました。スクリーンショットを撮ったので、意味がわかります。多対数の関係は、両端の矢印で示されています。

ここに画像の説明を入力してください

于 2012-06-16T13:23:45.520 に答える
0

私は同じ問題を抱えていましたが、それほどエレガントではない解決策を見つけました。のようだ

[NSEntityDescription insertNewObjectForEntityForName:@"myEntity" inManagedObjectContext:myManagedObjectContext];

myEntity最新バージョンの属性を持たないの古いバージョンを作成します。myEntityそのため、古いバージョンのモデルの名前を に変更したmyEntityOldところ、エラーは発生しなくなりました。

NSManagedObjectまたはのプロパティを設定することにより、XCodeで同じことを行うエレガントな方法があると思いますNSEntityDescription

于 2012-07-13T23:22:59.077 に答える
0

Title 属性が文字列に設定されていないように見えます。それを確認しましたか?

通常、インスタンスに送信された認識されないセレクターは、オブジェクトが処理方法を知らないオブジェクトにメッセージを送信することによって発生する実行時エラーです。

Subscriptions *sbs = (Subscriptions *)[NSEntityDescription insertNewObjectForEntityForName:@"Subscriptions" inManagedObjectContext:context];
sbs.Title = @"OK";

その助けを願って

ここで簡単なプロジェクトを作成しました。

于 2010-12-28T13:41:20.230 に答える