核心数据:托管对象和实体之间的区别?
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。您可以编写自己的商店(使用 NSAtomicStore
和 NSIncrementalStore
类),例如,如果您有自己的文件类型(理论上,如果您愿意,您可以编写商店来打开 Word 或 Photoshop 文件)
NSEntityDescription
- 可以将实体视为托管对象的“类”。它定义了托管对象应具有的所有属性 (NSAttributeDescription
)、关系 (NSRelationshipDescription
) 和获取的属性 (NSFetchedPropertyDescription
),以及应使用的其他属性,例如 NSManagedObject
子类
NSManagedObjectContext
- 这是内存中的“便签本”。您可以在此处查询对象(使用 NSFetchRequests
)、创建对象、删除对象等。您可以拥有多个上下文,并且可以在不保存的情况下丢弃一个以丢弃您不再需要的任何更改。
NSManagedObject
- Core Data 的核心单元。这些是保存数据的模型对象。您可以设置它们的属性、关系等。
NSManagedObjectModel
- 这表示用于数据的数据模型,通常在 Xcode 中创建的 .mom 文件中定义。这是所有实体的存储位置。
这几乎就是核心数据的全部内容。还有其他一些用于迁移和合并的类
【讨论】:
喜欢答案,但有一些小的变化。NSManagedObjectModel
和 NS*Description
类都定义了核心数据模型应该/可以包含的内容。 NSPersistentStoreCoordinator
是能够将模型中的内容转换为内存中的内容的类,反之亦然。 NSManagedObject
实例是在内存中实现的模型。 NSManagedObjectContext
是确保应该是什么最终与什么是一致的经理。
感谢您的两个回答,我仍然对 NSManagedObject 和 Entity 有点困惑:所以 managedObject 包含 1 个实体,而 managedObjectModel 包含所有 managedObjects?还是他们分开了?
一个托管对象模型包含所有实体。托管对象上下文包含所有托管对象。每个托管对象都有一个实体(很像每个对象都有一个类)。
没有。托管对象就像一个实体的实例。如果您在想象之前已经完成了数据库工作,那么实体就是一张表,一个托管对象就是一行。您指定一个实体来过滤托管对象。在您提供的示例中,您将取回实体 Employee 的所有托管对象。同样,如果您以前做过数据库方面的工作,那么就 SQL 而言,您可能已经做过 SELECT * FROM Employee
@KrishnaSapkota 那不正确。托管对象是使用实体描述创建的,但不是它的子类(所有托管对象都是 NSManagedObject 的子类,而 NSManagedObject 又是 NSObject 的子类)。以上是关于核心数据:托管对象和实体之间的区别?的主要内容,如果未能解决你的问题,请参考以下文章