1

我有一个简单的情况,我有一个 CDPerson 类,它是 NSManagedObject 的子类。此类包含与 CDHair 类(也是 NSManagedObject 的子类)的一对一关系。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[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 类是什么。其次,我认为从 fetch 中检索到的属性将是 CDHair 的 CoreData 实例,但情况似乎并非如此。它也不是 NSManagedObject。

我哪里出错了?

4

3 回答 3

2

由于您已明确设置

fetchRequest.resultType = NSDictionaryResultType;

fetch 请求返回一个字典,与其他对象的关系由 a 表示NSManagedObjectIDobjectWithID您可以使用orexistingObjectWithID方法从“托管对象 id”中检索相应的对象。例如:

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

但是设置propertiesToFetch为您感兴趣的实际属性可能更容易CDHair ,例如

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

然后结果数组看起来像

(
{
    “头发。颜色”=绿色;
},
{
    “头发.颜色”=红色;
}
)

你可以像访问它

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

您要求提供CDPerson实体的关系属性。这只会导致返回的字典被这些人objectID的相关人员填充CDHair

生成的字典中填充了与结果集NSObjectIDCDHair元素(所有现有人员)相关的对象。这就是为什么您不能直接使用这些对象来获取它们的属性的原因。existingObjectWithID:error:您可以通过使用,objectWithID:并将NSManagedObjectContext返回的 ID 传递给它来获取实际对象。

如果您喜欢CDHair使用中的不同对象,您可以将您的请求更改为:(
假设反向关系命名为persons

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

这应该为您提供商店中 sCDHair使用的所有不同对象。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 回答