【问题标题】: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”,但那里什么也没有。在我尝试限制获取的属性之前,我什至不知道您可以更改结果类型:)顺便说一句,我有你的书;)

标签: ios core-data nsfetchrequest


【解决方案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 之类的内容。也许他们认为这也应该有效,但从未尝试过实际这样做???
猜你喜欢
  • 2010-12-16
  • 1970-01-01
  • 1970-01-01
  • 2016-05-07
  • 1970-01-01
  • 1970-01-01
  • 2015-04-24
  • 2011-04-13
  • 2011-03-02
相关资源
最近更新 更多