核心数据:获取关系属性
Posted
技术标签:
【中文标题】核心数据:获取关系属性【英文标题】:Core Data: Fetching Relationship Attributes 【发布时间】:2013-05-11 17:59:52 【问题描述】:在将获取限制为多个属性时,似乎无法弄清楚从关系中获取属性的技巧。在下面的代码中,“缩略图”是实体“照片”的可转换 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];
【问题讨论】:
对_NSObjectID_48_0
的引用表明您在某处使用了NSManagedObjectIDResultType
,尽管您的代码显示NSDictionaryResultType
。您是否在某处询问过对象 ID?
没有。我在整个项目中搜索“NSManagedObjectIDResultType”,但那里什么也没有。在我尝试限制获取的属性之前,我什至不知道您可以更改结果类型:)顺便说一句,我有你的书;)
【参考方案1】:
使用NSDictionaryResultType
,您可以方便地获取实体的属性。它不适用于遍历关系。这就是为什么当您执行合乎逻辑的操作时会出现错误:获取previewImage.uiImage
。
来自文档:
属性描述可以表示属性、一对一关系或表达式。
也许您仍在考虑数据库查询,您可以选择性地选择要获取的“字段”。这在 Core Data 中不是必需的,它是一个对象图,而不是数据库。
相反,只需获取您的 NSManagedObject
s。如果你担心记忆,你不应该担心。核心数据使用一种称为 faulting 的机制来仅获取它需要的内容。事实上,上述神秘的"<x-coredata://03FF7129-1345-4BAE-A74E-2FF5A2B38CDC/Image/p5>"
与控制台中显示的故障非常相似。
尝试使用普通实体进行提取。您可以期望它“正常工作”。
【讨论】:
是的,我回到了“旧”的方式。我试图变得太“聪明”,因为我在 Photo 上有一些属性,比如 NSData 用于我不想获取或出错的图像(这实际上是我现在在另一个实体中拥有 uiImage 的原因)。所以,Photo 的其余属性现在都是轻量级的。但是,我仍然想知道该怎么做:) 你可以做到,但你必须使用 2 提取。我认为如何做到这一点应该很明显。请参阅我对答案的编辑,以解释为什么您不能一次性完成。 只是我在 SO 中看到过代码(可能从未测试过),它显示了诸如 previewImage.uiImage 之类的内容。也许他们认为这也应该有效,但从未尝试过实际这样做???以上是关于核心数据:获取关系属性的主要内容,如果未能解决你的问题,请参考以下文章