核心数据:托管对象和实体之间的区别?

Posted

技术标签:

【中文标题】核心数据:托管对象和实体之间的区别?【英文标题】:core data : differences between managed object and entities? 【发布时间】:2011-08-01 20:25:07 【问题描述】:

我想了解更多核心数据,为什么我们要“获取”和搜索实体,而实体是“内部”托管对象?例如:

NSManagedObjectContext *moc = [self managedObjectContext];  
NSEntityDescription *entityDescription =
    [NSEntityDescription entityForName:@"Employee" inManagedObjectContext:moc];  
NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];  
[request setEntity:entityDescription];

另外,持久对象存储包含什么?如果我理解的话,持久对象存储从一个 sqlite 文件中获取数据,但是它有点困惑,是不是:一个实体,一个持久对象存储,一个数据在 sqlite 文件中?

感谢您的回答

保罗

【问题讨论】:

【参考方案1】:

这里基本上有 5 个组件。持久存储协调器、托管对象上下文、托管对象模型、实体和托管对象。它们一起工作以提供一个对象图管理系统(请注意,Core Data 不是 ORM,所以不要这样想是有帮助的)。以下是 CoreData 中与它们交互的组件和各种其他类的描述

NSPersistentStoreCoordinator - 这处理从磁盘加载数据和从磁盘加载数据。它处理各种商店(NSPersistentStore)。包含的存储类型是二进制、XML 和 SQLite。您可以编写自己的商店(使用 NSAtomicStoreNSIncrementalStore 类),例如,如果您有自己的文件类型(理论上,如果您愿意,您可以编写商店来打开 Word 或 Photoshop 文件) NSEntityDescription - 可以将实体视为托管对象的“类”。它定义了托管对象应具有的所有属性 (NSAttributeDescription)、关系 (NSRelationshipDescription) 和获取的属性 (NSFetchedPropertyDescription),以及应使用的其他属性,例如 NSManagedObject 子类 NSManagedObjectContext - 这是内存中的“便签本”。您可以在此处查询对象(使用 NSFetchRequests)、创建对象、删除对象等。您可以拥有多个上下文,并且可以在不保存的情况下丢弃一个以丢弃您不再需要的任何更改。 NSManagedObject - Core Data 的核心单元。这些是保存数据的模型对象。您可以设置它们的属性、关系等。 NSManagedObjectModel - 这表示用于数据的数据模型,通常在 Xcode 中创建的 .mom 文件中定义。这是所有实体的存储位置。

这几乎就是核心数据的全部内容。还有其他一些用于迁移和合并的类

【讨论】:

喜欢答案,但有一些小的变化。 NSManagedObjectModelNS*Description 类都定义了核心数据模型应该/可以包含的内容。 NSPersistentStoreCoordinator 是能够将模型中的内容转换为内存中的内容的类,反之亦然。 NSManagedObject 实例是在内存中实现的模型。 NSManagedObjectContext 是确保应该是什么最终与什么是一致的经理。 感谢您的两个回答,我仍然对 NSManagedObject 和 Entity 有点困惑:所以 managedObject 包含 1 个实体,而 managedObjectModel 包含所有 managedObjects?还是他们分开了? 一个托管对象模型包含所有实体。托管对象上下文包含所有托管对象。每个托管对象都有一个实体(很像每个对象都有一个类)。 没有。托管对象就像一个实体的实例。如果您在想象之前已经完成了数据库工作,那么实体就是一张表,一个托管对象就是一行。您指定一个实体来过滤托管对象。在您提供的示例中,您将取回实体 Employee 的所有托管对象。同样,如果您以前做过数据库方面的工作,那么就 SQL 而言,您可能已经做过 SELECT * FROM Employee @KrishnaSapkota 那不正确。托管对象是使用实体描述创建的,但不是它的子类(所有托管对象都是 NSManagedObject 的子类,而 NSManagedObject 又是 NSObject 的子类)。

以上是关于核心数据:托管对象和实体之间的区别?的主要内容,如果未能解决你的问题,请参考以下文章

将子实体加载到核心数据中的托管对象

核心数据:如何在不通过字符串引用实体的情况下创建托管对象

如何在核心数据中保存单个实体

如何在核心数据中将非托管对象更改为托管对象

核心数据 - 托管对象问题

从 Git 中检索核心数据托管对象模型