【问题标题】: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 文件中?

感谢您的回答

保罗

【问题讨论】:

    标签: core-data nsmanagedobject entities


    【解决方案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 的子类)。
    猜你喜欢
    • 2012-10-23
    • 1970-01-01
    • 1970-01-01
    • 2017-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-06
    • 1970-01-01
    相关资源
    最近更新 更多