私は昨日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に送信されました
なぜこれが起こっているのか分かりません。助けてください!!!みなさん、よろしくお願いします!
サブスクリプションのヘッダーを追加
Subscriptions.h
@interfaceサブスクリプション:NSManagedObject {
}
@ property(nonatomic、retain)NSString *タイプ;
@ property(nonatomic、retain)NSDecimalNumber *読み取り;
@ property(nonatomic、retain)NSString *タイトル;
@ property(nonatomic、retain)NSString *コード;
@ property(nonatomic、retain)NSDecimalNumber *新規;
@終わり
何も変更しませんでした。 Xcodeが作成したのと同じです。
大文字の変数名は使用しないでください。ゲッターとセッターが正しく機能しない可能性があります。
NSManagedObjectサブクラスをデータモデルから生成した場合、すべてが正常に機能するはずですが、@ dynamicであり、セッターはcoredataによって実装されており、既に実装されているため、合成に変更しないでください。少なくとも私にとっては、@ dynamicを@synthesizeに変更した後、coredataは空のオブジェクトを返します。
また、データモデルにクラス名を設定することを忘れないでください。
私はこれを取得していて、プロジェクトでクリーンを実行し、それを修正しました。
Core Dataエンティティに属性を追加し、NSManagedObjectSubclassを再作成する代わりに、空想を得て、既存のサブクラスに@propertyと@dynamicを手動で追加しようとしました。
それは機能しませんでした、それで私はXCodeを介してサブクラスを再作成しました、それは私がこのエラーを受け取り始めたときです( "認識されないセレクターがに送信されました属性の値を設定する場合は「インスタンス」)。
したがって、私はXCodeを介してCore Data Modelの新しいバージョンを作成しました、次に派生データをクリーンアップして削除し、次にNSManagedObjectサブクラスを再作成しました。それはうまくいった。
おそらく、新しいデータモデルとそれに基づいた新しいサブクラスを作成していたので、派生データをクリーンアップまたは削除する必要はなかったでしょう...しかし、それも害はありませんでした!
2つの考えられる問題
これらのプロパティに対応する@dynamicブロックが.mファイルにありますか
大文字のプロパティは使用しないでください。コーディング規則では、少なくとも最初の文字のプロパティは小文字であるため、コンパイラがメソッドを合成するときはそうです。
@property (nonatomic, retain) NSString * type;
in .h
そして
@dynamic type;
in .m
のようなものになります
-(void)setType:(NSString *)atype
{
....
[self willChangeValueForKey:@"type"];
[self setPrimitiveValue:atype forKey:@"type"];
[self didChangeValueForKey:@"type"];
}
-(NSString *)type
{
return [self primitiveValueForKey:@"type"];
}
バックグラウンドで。あなたは今までそのコードを見ることができませんが。
ケースの慣習はあなた次第ですが、キャメルキャップは名目上ココアでは正常です。ただし、Big Furry Cat
などのオブジェクトはbigFurryCat
になります。 Appleの例のスタイルに従ってください。
[〜#〜] edit [〜#〜]-@ synthesizeを@dynamicに変更します
エンティティとの関係を持つことで、関係の一部が多対数になるようにする必要があることがわかりました。スクリーンショットを撮って、意味がわかるようにしました。多対数の関係は、両端の矢印で示されています。
私は同じ問題を抱えていて、それほどエレガントではない解決策を見つけました。のようだ
[NSEntityDescription insertNewObjectForEntityForName:@"myEntity" inManagedObjectContext:myManagedObjectContext];
最新バージョンの属性を持たない古いバージョンのmyEntity
を作成します。そのため、古いバージョンのモデルのmyEntity
の名前をmyEntityOld
に変更しましたが、エラーは発生しなくなりました。
NSManagedObject
またはNSEntityDescription
のプロパティを設定することにより、XCodeで同じことを行うエレガントな方法があると思います。
次の手順を実行します
1)Xcodeを介してCore DataModelの新しいバージョンを作成しました。
2)関係を修正します(2つの間に新しい関係を追加しました。)
3)NSManagedObjectサブクラスを再作成しました
Title属性がstringに設定されていないように見えます。確認しましたか?
通常、インスタンスに送信される認識されないセレクターは、オブジェクトが処理方法を知らないというメッセージをオブジェクトに送信することによって引き起こされるランタイムエラーです。
Subscriptions *sbs = (Subscriptions *)[NSEntityDescription insertNewObjectForEntityForName:@"Subscriptions" inManagedObjectContext:context];
sbs.Title = @"OK";
お役に立てば幸いです