核心数据:获取关系属性

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 中不是必需的,它是一个对象图,而不是数据库

相反,只需获取您的 NSManagedObjects。如果你担心记忆,你不应该担心。核心数据使用一种称为 faulting 的机制来仅获取它需要的内容。事实上,上述神秘的"&lt;x-coredata://03FF7129-1345-4BAE-A74E-2FF5A2B38CDC/Image/p5&gt;" 与控制台中显示的故障非常相似。

尝试使用普通实体进行提取。您可以期望它“正常工作”。

【讨论】:

是的,我回到了“旧”的方式。我试图变得太“聪明”,因为我在 Photo 上有一些属性,比如 NSData 用于我不想获取或出错的图像(这实际上是我现在在另一个实体中拥有 uiImage 的原因)。所以,Photo 的其余属性现在都是轻量级的。但是,我仍然想知道该怎么做:) 你可以做到,但你必须使用 2 提取。我认为如何做到这一点应该很明显。请参阅我对答案的编辑,以解释为什么您不能一次性完成。 只是我在 SO 中看到过代码(可能从未测试过),它显示了诸如 previewImage.uiImage 之类的内容。也许他们认为这也应该有效,但从未尝试过实际这样做???

以上是关于核心数据:获取关系属性的主要内容,如果未能解决你的问题,请参考以下文章

关系属性的核心数据获取请求

具有特殊限制的核心数据获取关系计数

从多对多关系中获取核心数据

从具有实体之间关系的核心数据中获取数据[重复]

核心数据:获取特定对象的多对多关系中的所有实体?

核心数据:在获取时重命名属性