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

Ios 学习核心数据。实体,添加和加载,ios,core-data,Ios,Core Data,因此,我尝试使用核心数据来保存“Screenshot”类的实例,该类包括: NSString *note; NSData *screenshot; NSData *thumbnailOfScreenshot; NSTimeInterval date; 在我的核心数据文件中,我有两个实体,因为我只想在必要时获取大图像,一次只获取一个(它将在UITableView中使用) 实体1称为屏幕截图,由上述4个属性组成,而*屏幕截图是暂时的。该实体还与实体2(称为索引的int)具有一对一关系 实体2只

因此,我尝试使用核心数据来保存“Screenshot”类的实例,该类包括:

NSString *note;
NSData *screenshot;
NSData *thumbnailOfScreenshot;  
NSTimeInterval date;
在我的核心数据文件中,我有两个实体,因为我只想在必要时获取大图像,一次只获取一个(它将在UITableView中使用)

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

实体2只有1个属性,这是用于大型图像的二进制数据字段。还与实体1建立一对一关系

那么,我的第一个问题是:这是否接近正确?我有点不确定是否需要实体1中的瞬态属性“screenshot”如果我需要为实体2创建一个新类,我也会感到困惑,这似乎有点奇怪,因为它只包含图像。

现在,我只想在DB中添加和加载实例。 以下是我(认为)如何将实例添加到DB中,但我不确定它是否立即将其放入DB中:

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

我现在忙得不可开交,任何帮助都将不胜感激。我读过几本指南,但没有一本针对类似的内容。

瞬态属性不会保存到核心数据中(它们既不会被检索,也不会从备份存储中保存)。它们在基于存储的属性计算某种属性时最为有用(例如,我使用它们进行基于某人姓氏第一个字母的查询——我存储的是完整的姓氏,但firstLetterOfLastName是一个临时属性——但我可以对结果进行排序,因为核心数据知道它)

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

我也不认为你的“大图像”需要一个全新的模型。通过启用“存储在外部记录文件中”,可以指示核心数据优化其大二进制属性的备份存储。您将在数据模型检查器窗格中找到它,其中设置了瞬态和可选。这将使实际的备份数据库保持快速,但允许核心数据检索这些大型二进制属性,并且您仍然可以在核心数据NSManagedObject实例中轻松地使用它们

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


核心数据是对象图,而不是关系数据库。如果将同一对象实例添加到不同所有者对象实例上的两个关系中,则不会复制子对象——核心数据会为您完成所有相关工作(假设您的模型设置良好)。

我会重新考虑这一点。我认为一个实体就足够了。我要么添加一个名为“large”的BOOL值,然后在“large=NO”时进行提取,以获取小图像。或者,如果需要更多控制,请添加描述图像大小的“像素”或“百万像素”字段。然后,您可以在“像素>3000000”的位置获取图像

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

或者,您也可以将一个实体作为另一个实体的“父实体”(当您选择了一个实体时,请参见数据模型检查器)

你在正确的轨道上。不断思考如何使用实体。这将帮助您更好地描述关系。在数据模型中定义实体之前,我经常编写使用这些实体的代码。这让我的界面更清晰,实体之间的重叠更少