因此,我试图使用Core数据来保存“Screen快照”类的实例,其中包括:
NSString *note;
NSData *screenshot;
NSData *thumbnailOfScreenshot;
NSTimeInterval date;
在我的核心数据文件中,我有两个实体,因为我希望只在必要时获取大型映像,每次只获取一个(它将在UITableView中使用)。
实体1称为屏幕快照,由上面的4个属性组成,而*屏幕快照是短暂的。该实体还与实体2(称为索引的int )有一对一的关系。
实体2只有一个属性,它是大型图像的二进制数据字段。也是与实体1的一对一关系。
所以,我的第一个问题:这是否一点都是正确的?我有点不确定是否需要实体1中的瞬态属性“屏幕快照”。和我也很困惑是否需要为实体2创建一个新的类,这看起来有点奇怪,因为它只包含图像。
现在,我只是尝试向DB添加和加载实例。下面是我(认为)如何向DB中添加一个实例,但我不确定它是否立即将它放入数据库中?:
Screenshot *s = [NSEntityDescription insertNewObjectForEntityForName:@"Screenshot" inManagedObjectContext:context];
我太过分了,所以任何帮助都会受到感谢。我读过几本指南,但没有一本是针对类似的。
发布于 2014-06-27 08:00:56
瞬态属性不会保存到Core数据中(它们既不会被检索,也不会从备份存储中保存出来)。它们通常用于根据存储的属性计算某种类型的属性(例如,我将它们用于基于一个人姓氏的第一个字母的查询-我存储的是全名,但firstLetterOfLastName是一个临时属性-因为核心数据知道它,所以我可以命令结果)。
如果我对你的模型的理解是正确的,你很可能根本不想要瞬变特性。
我也不认为你需要一个全新的模式,为你的“大图像”。您可以通过打开“外部记录文件中的存储”来指示Core数据优化其大型二进制属性的后备存储。您将在设置瞬态和可选选项的数据模型检查器窗格中找到这一点。这将保持实际备份DB的快速性,但允许核心数据检索这些大型二进制属性,您仍然可以使用Core实例来处理它们。
此外,通常,不要通过其他存储的Core数据对象的“索引”值来关联项。这样做有很多理由,但总的来说,这就是核心数据关系的目的。如果“电影”有多个“屏幕截图”,例如,您将在一个名为“屏幕快照”的电影实例上建立一种关系,您只需将每个屏幕快照添加到其中(就您所关心的而言,它实际上是一个NSMutableSet )。
核心数据是对象图,而不是关系数据库。如果将相同的对象实例添加到不同所有者-对象实例上的两个关系中,则不会重复子对象-对象-核心数据为您关联它们的所有工作(假设您的模型是以良好的方式设置的)。
发布于 2014-06-27 08:03:02
我会重新考虑的。我认为一个单一的实体就足以解决这个问题。我要么添加一个名为'large‘的BOOL值,然后在"large = NO“时进行一次提取以获得小图像。或者,如果您想要更多的控制,添加一个“像素”或“百万像素”字段来描述图像的大小。然后,您就可以获取‘像素> 3000000’的位置。
如果您在两个图像之间有特殊的关系(即一个图像是另一个图像的缩略图),我只需要将一个关系添加到另一个屏幕实体中。
或者,您也可以使一个实体成为另一个实体的“父实体”(当您选择了一个实体时,请参阅Data检查器)。
你走在正确的轨道上。继续思考你想如何使用你的实体。这将帮助你更好地描述关系。我经常在数据模型中定义实体之前编写使用实体的代码。这使我最终获得了更干净的接口,减少了实体之间的重叠。
https://stackoverflow.com/questions/24455873
复制相似问题