2013-05-11 133 views
1

似乎无法找出在将获取限制为多个属性时从关系中获取属性的技巧。在下面的代码中,“thumbnail”是实体“Photo”的可转换的UIImage属性。在关键“缩略图”的字典数组中,这总是可以恢复正常。我无法弄清楚的是第二个属性/属性,其中“previewImage”是Photo中另一个名为“Image”的实体,具有可变形属性“uiImage”(它是UIImage)。核心数据:获取关系属性

我已经试过这样:

[fetchRequest setPropertiesToFetch:@[@"thumbnail", @"previewImage.uiImage"]]; 

,但我得到这个错误:

-[NSExpressionDescription valueTransformerName]: unrecognized selector sent to instance 0x13078920 

,我已经试过这样:

[fetchRequest setPropertiesToFetch:@[@"thumbnail", @"previewImage"]]; 

在那里我得到两个项目在每个字典中

{ 
    previewImage = "0xbabba90 <x-coredata://03FF7129-1345-4BAE-A74E-2FF5A2B38CDC/Image/p5>"; 
    thumbnail = "<UIImage: 0xbabbc60>"; 
} 

,但是当我尝试使用“图像”对象,如下

NSDictionary *dict = [self.photos objectAtIndex:0]; 
Image *theImage = (Image *)[dict objectForKey:@"previewImage"]; 
[self.delegate photoCollectionViewController:self didSelectPreviewImage:theImage.uiImage]; 

我得到这个错误

"[_NSObjectID_48_0 uiImage]: unrecognized selector sent to instance 0xbabba90" 

而且我甚至抛出这在要求

[fetchRequest setRelationshipKeyPathsForPrefetching:@[@"previewImage.uiImage"]]; 

所以,我想我是甩手而没有得到这个。任何帮助,将不胜感激。谢谢!

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Photo" inManagedObjectContext:self.managedObjectContext]; 
[fetchRequest setEntity:entity]; 
[fetchRequest setResultType:NSDictionaryResultType]; 
+0

对'_NSObjectID_48_0'的引用表明你在某处使用了'NSManagedObjectIDResultType',尽管你的代码表示为'NSDictionaryResultType'。你是否在某处要求提供对象ID? – 2013-05-11 19:57:12

+0

不,我在整个项目中搜索了“NSManagedObjectIDResultType”,但没有任何内容。我甚至不知道你可以改变结果类型,直到我试图限制提取的属性:)顺便说一句,我有你的书;) – user1139479 2013-05-11 20:26:01

回答

1

随着NSDictionaryResultType您可以方便地获取实体的属性。它不适用于遍历关系。这就是为什么当你做出合乎逻辑的事情时你会得到一个错误:要获取previewImage.uiImage

从文档:

The property descriptions may represent attributes, to-one relationships, or expressions.

也许你仍然在数据库中查询,让您有选择性地选择了“田”获取的角度思考。在Core Data中这不是必需的,它是一个对象图,而不是数据库。请致电NSManagedObject s。如果你担心记忆,你不应该这样做。核心数据使用一种称为错误的机制来仅提取它所需的内容。事实上,上述神秘的"<x-coredata://03FF7129-1345-4BAE-A74E-2FF5A2B38CDC/Image/p5>"与在控制台中显示故障的方式非常相似。

尝试使用普通实体进行抓取。你可以期待它“只是工作”。

+0

是的,我回到了“老”的方式。我试图过于“聪明”,因为我在Photo上有一些属性,例如NSData,因为我不想获取或错误的图像(这实际上是我现在在另一个实体中具有uiImage的原因)。所以,Photo的其他属性现在都是轻量级的。但是,我仍然想知道如何去做:) – user1139479 2013-05-11 20:07:28

+0

你可以做到这一点,但你必须使用** 2 **提取。我认为如何做到这一点应该是显而易见的。看到我的编辑回答解释为什么你不能在一个。 – Mundi 2013-05-11 20:19:25

+0

不过,你应该标记正确的答案。 – Mundi 2013-05-13 09:30:02