1

単純な状況があります。NSManagedObject のサブクラスである CDPerson クラスがあります。このクラスには、CDHair クラス (NSManagedObject のサブクラスでもあります) との 1 対 1 の関係が含まれています。CDPerson クラスの関係プロパティの名前は「hair」です。

ManagedObjectContext 内のすべての CDPerson インスタンスで実際に使用されている個別の CDHair インスタンスを取得したいと考えています。

私はプロパティの個別のリストを取得しています(そしてこの部分は機能します)、

 NSFetchRequest* fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Person"];
 fetchRequest.returnsDistinctResults = YES;
 fetchRequest.propertiesToFetch = @[@"hair"];
 fetchRequest.resultType =NSDictionaryResultType;
 fetchRequest.predicate=[NSPredicate predicateWithFormat:@"hat=='no'"];
 fetchRequest.returnsDistinctResults = YES;
 NSArray* fetchResults = [context executeFetchRequest:fetchRequest error:&error];

予想どおり、NSArray の fetchResults。fetchResults[0] は予想どおり NSDictionary です。fetchResults[0][@"hair"] は何かに解決されますが、それが何であるかはわかりません。それはpoの説明です

0x8b7b120 <x-coredata://C7E53293-94C7-444D-8162-167B1D66A961/Hair/p33>

セレクターがないようです。それを CDHair にキャストし、インスタンスでプロパティ (.color など) を使用しようとすると、「認識されないセレクター」エラーが発生します。

CDTest[2865:70b] -[_NSObjectID_48_0 color]: unrecognized selector sent to instance 0x8ba8670

まず、クラス _NSObjectID_48_0 が何であるかわかりません。次に、フェッチから取得されたプロパティは CDHair の CoreData インスタンスであると考えましたが、そうではないようです。また、NSManagedObject ではありません。

どこで間違ったのですか?

4

3 に答える 3

2

明示的に設定しているので

fetchRequest.resultType = NSDictionaryResultType;

フェッチ リクエストは辞書を返し、他のオブジェクトとの関係は で表されますNSManagedObjectIDobjectWithIDorexistingObjectWithIDメソッドで「管理オブジェクトID」から対応するオブジェクトを取得できます。例えば:

NSManagedObjectID *mid = fetchResults[0][@"hair"];
CDHair *hair = (CDHair *)[context objectWithID:mid];
NSString *color = hair.color;

propertiesToFetchただし、関心のある実際のプロパティに設定する方が簡単な場合がありCDHair ます。たとえば、

fetchRequest.propertiesToFetch = @[@"hair.color"];

次に、結果の配列は次のようになります

(
{
    "hair.color" = 緑;
}、
{
    "hair.color" = 赤;
}
)

そして、あなたはそれにアクセスすることができます

NSString *color = fetchResults[0][@"hair.color"];
于 2013-11-07T18:55:19.827 に答える
1

CDPersonエンティティの関係プロパティを要求しました。これにより、返された辞書に、これらの人物objectIDの関連者が入力されるだけになります。CDHair

結果の辞書には、結果セットの要素 (既存のすべての人物) にNSObjectID関連するオブジェクトが取り込まれます。CDHairこれが、これらのオブジェクトを直接使用してプロパティにアクセスできない理由です。existingObjectWithID:error:の、を使用し、返された ID を渡すことでobjectWithID:、実際のオブジェクトを取得できます。NSManagedObjectContext

CDHair使用中の個別のオブジェクトが気に入った場合は、リクエストを次のように変更できます:
(逆の関係が という名前であると仮定しますpersons)

NSFetchRequest* req = [NSFetchRequest fetchRequestWithEntityName:@"CDHair"];
req.predicate = [NSPredicate predicateWithFormat:@"persons.@count != 0"];

これにより、ストア内のによって使用されているすべての個別のCDHairオブジェクトが得られます。CDPerson

于 2013-11-07T19:02:50.883 に答える
0

このような色のプロパティを取得しようとしましたか?

NSArray* fetchResults = [moc executeFetchRequest:fetchRequest error:&error];
for (NSDictionary* hair in fetchResults) {
  NSLog(@"Hair Color is:", [hair objectForKey:@"color"]);
}
于 2013-11-07T17:30:04.883 に答える