如何像实体框架一样在Core Data的一个类文件中对属于一个实体的方法进行分组?
Posted
技术标签:
【中文标题】如何像实体框架一样在Core Data的一个类文件中对属于一个实体的方法进行分组?【英文标题】:How to group methods belong to one entity in one class file in Core Data like in Entity Framework? 【发布时间】:2010-06-05 17:31:44 【问题描述】:如何在像Entity Framework这样的Core Data中将属于一个实体的方法分组?
在Linq中,我们可以把所有的方法都放在领域对象类中,然后复用它们,在Core Data中,有没有办法为不同的实体创建不同的类呢?还是只能用谓词检索?
我似乎无法为我在数据模型中配置的每个实体定义类。我可以通过 ORM 控制物理数据库模式,这不像 hibernate。如果我错了,请纠正我,据我所知,我不相信 Core Data 可以做到这一点。
那么使用 Core Data 有什么优势呢? Cocoa 上是否有任何机制可以定义我的域对象类,例如主键、外键,然后创建数据库模式?
Core Data 好像只能支持配置对象,但根本没有办法通过 Core Data 来配置物理数据库。
【问题讨论】:
【参考方案1】:在您的核心数据模型中,您可以定义将实体实例化为的类:
alt text http://img404.imageshack.us/img404/3368/setclass.png
当 Core Data 从存储中获取对象时,它会尝试将它们创建为此类的实例(虽然它不是那么简单,但 Core Data 会使用一些技巧)。
您可以通过在新窗口中打开核心数据模型并选择 File->New File 来为您的实体自动生成类文件:
alt text http://img241.imageshack.us/img241/8238/newfile.png
您应该会看到一个新的“托管对象类”项:
alt text http://img46.imageshack.us/img46/348/managedobjectclass.png
选择此项并选择要为其生成类的实体:
alt text http://img241.imageshack.us/img241/5030/selectentity.png
将生成一个具有各种属性的类,用于获取/设置实体的属性:
alt text http://img10.imageshack.us/img10/9868/generatedproperties.png
如果您想添加自己的方法,我建议您将它们添加到单独的类别中。这是因为当您添加新属性或更改实体时,您通常希望重新生成这些核心数据类。如果您直接对这些文件进行添加,您将在下次生成它们时丢失所做的更改。
所以创建一个名为 Person+Additions 的类别或任何您认为合适的名称:
alt text http://img294.imageshack.us/img294/8871/addcategory.png
并向该类添加任何新方法或属性:
alt text http://img717.imageshack.us/img717/3884/addmethods.png
请注意,您不能添加新的实例变量,但 NSManagedObject 具有在内部字典中获取/设置值的功能。见NSManagedObject documentation
所以一旦你完成了这一切,你所做的就是将你从一个获取请求(或任何地方)获得的 NSManagedObject 转换为适当的类型:
#import "Person+Additions.h"
//...
Person *p = (Person *) [fetchResult objectAtIndex:0];
[p myCustomMethod];
//...
至于您关于主键以及与物理数据库交互的其他问题,这并不是 Core Data 旨在为您提供的真正内容。你不应该过多地考虑底层数据库,Core Data 意味着比这更高级。您定义模型,并通过 API 获取对象。像这样的主键和其他“数据库-y”细节不会暴露。
如果您想完全控制数据库,您应该使用 sqlite API。但我想说,对于大多数应用程序而言,Core Data 是更好的选择。
【讨论】:
【参考方案2】:查看KVC ("key-value-coding") 的文档。您使用键路径来获取所需的值。您还可以使用键路径对数组中的数据进行排序。为此,请查看NSSortDescriptors。否则,是的,只需更改您的 NSPredicate 并重新获取。
【讨论】:
以上是关于如何像实体框架一样在Core Data的一个类文件中对属于一个实体的方法进行分组?的主要内容,如果未能解决你的问题,请参考以下文章
为啥实体框架 System.Data.Entity.Core.Objects.RelationshipEntry 错误? (用于更改跟踪)
IOS/objective-c/core-data:如何从相关实体获取属性