学习核心数据。实体,添加和加载

时间:2014-06-27 15:46:32

标签: ios core-data

所以,我试图使用Core Data来保存"截图"课程,包括:

NSString *note;
NSData *screenshot;
NSData *thumbnailOfScreenshot;  
NSTimeInterval date;

在我的核心数据文件中,我有两个实体,因为我只想在必要时获取大图像,一次只能获取1个(它将在UITableView中使用)。

实体1称为屏幕截图,由上面的4个属性组成,而*屏幕截图是瞬态的。该实体还与实体2(称为索引的int)具有一对一的关系。

实体2只有1个属性,它是大图像的二进制数据字段。也是与实体1的一对一关系。

所以,我的第一个问题:这远远接近正确吗?我甚至不确定我是否需要实体1中的瞬态属性" screenshot",如果我需要为实体2创建一个新类,我也很困惑,这似乎是abit奇怪,因为它只包含图像。

目前,我只是尝试在数据库中添加和加载实例。 这是我(想)我如何向数据库中添加一个实例,但我不确定它是否真的将它直接放入数据库中?:

Screenshot *s = [NSEntityDescription insertNewObjectForEntityForName:@"Screenshot" inManagedObjectContext:context];

我在我的头上,所以任何帮助将不胜感激。我已经阅读了几个指南,但没有一个指向与此类似的东西。

2 个答案:

答案 0 :(得分:0)

瞬态属性不会保存到Core Data(它们既不会被检索也不会从后备存储中保存)。它们通常用于根据存储的属性计算某种属性(例如,我将它们用于基于人姓的第一个字母的查询 - 我存储的是完整的姓氏,但firstLetterOfLastName是一个瞬态属性 - 但是我可以在Core Data知道它的情况下订购结果。

如果我正确理解您的模型,您可能根本不需要瞬态属性。

我也认为你的“大图像”不需要全新的模型。您可以通过启用“存储在外部记录文件中”来指示Core Data优化其大型二进制属性的后备存储。您可以在设置Transient和Optional的下方的Data Model Inspector窗格中找到它。这将保持实际的后备DB snappy,但允许Core Data检索这些大型二进制属性,您仍然可以使用Core Data NSManagedObject实例无缝地使用它们。

此外,通常,不要通过某些其他存储的Core Data对象的“索引”值来关联项目。有很多理由这样做,但总的来说,这就是核心数据关系的用途。如果“电影”有多个“屏幕截图”,例如,您将在名为“屏幕截图”的电影实例上建立关系,您只需将每个屏幕截图添加到(根据您的意愿,它实际上是一个NSMutableSet)。

核心数据是对象图,而不是关系数据库。如果将相同的对象实例添加到不同所有者对象实例上的两个关系中,则不会复制子对象 - Core Data会为您进行相互关联的所有工作(假设您的模型设置得很好)

答案 1 :(得分:0)

我重新考虑这一点。我认为单个实体就足够了。我要么添加名为' large'的BOOL值。当" large = NO"得到小图像。或者,如果您想要更多控制,请添加一个像素'或者“百万像素”和“百万像素”。描述图像大小的字段。然后,您可以获取'像素> 3000000'例如。

如果两个图像之间存在特殊关系(即一个图像是另一个图像的缩略图),我只是将关系添加到另一个屏幕截图实体。

或者,您也可以将一个实体设为"父实体"另一个(当您选择实体时,请参阅数据模型检查器)。

你走在正确的轨道上。继续考虑如何使用您的实体。这可以帮助您更好地描述关系。在我在数据模型中定义实体之前,我经常编写使用实体的代码。这让我最终得到了更清晰的界面,并减少了实体之间的重叠。