为啥有些实体 NSManagedObjects 和一些以其类命名?

Posted

技术标签:

【中文标题】为啥有些实体 NSManagedObjects 和一些以其类命名?【英文标题】:Why are some entities NSManagedObjects and some named after their class?为什么有些实体 NSManagedObjects 和一些以其类命名? 【发布时间】:2010-10-18 10:38:14 【问题描述】:

我注意到,在我的 Core Data 数据模型中,一些实体(在左上角面板中)有一个“NSManagedObject”类,一些实体以一个类(Person、Company 等)命名。实体是否具有 Person 等的 NSManagedObject 类似乎没有任何逻辑。而且我的代码似乎工作正常。所以我想知道为什么会有差异?

编辑

感谢 Benedict Cohen 让事情变得更加清晰。 这是我当前的代码:

Person *per = (Person *)[NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:managedObjectContext];
[per setName:@"Steve Jobs"];

..无论数据模型中是否明确提及自定义类,这都有效。但我仍然需要自定义类。我做错了吗?我想知道我是否可以简化我的代码。自定义类是通过选择实体并转到“新文件 - 托管对象类”来创建的。但我认为当我更改它们时链接可能已损坏。

【问题讨论】:

逻辑是:你创造了它,现在你拥有了它。除非您创建了自定义类,否则不会使用自定义类。 你不需要转换insertNewObjectForEntityForName:的返回值,因为返回类型是id,而不是NSManagedObject。当类型为 id 时,编译器假定您知道自己在做什么,并且不会发出任何警告。 【参考方案1】:

最好为每个实体创建一个类,但这不是必需的。通过为实体创建一个类,可以使用属性而不是setValue:forKey: 例如:

person.name = @"Harry Hippy"; //this is good
[person setValue:@"Harry Hippy" forKey:@"naem"]; //this is bad. The compiler won't notice the typo and will result in a run-time error

只要Person 需要做的不仅仅是存储数据,您就必须创建一个类。

【讨论】:

谢谢。我已经更新了我的问题。看起来我需要一个自定义类,因为我将它转换为自定义类? .. 另外,您能否举例说明托管对象自定义类除了存储数据之外还需要做什么......? 例如,如果您尝试保存少于 2 个字符的名称,您可以实现一个显示消息的函数。

以上是关于为啥有些实体 NSManagedObjects 和一些以其类命名?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 XCode 调试器中调试 NSManagedObjects?

将排序的 NSManagedObjects 重新分配给 NSSet

序列化包含对核心数据中 NSManagedObjects 的引用的多维数组

如何将其他 NSManagedObjects 存储为 NSManagedObject 的属性

NSFetchedResultsController 不更新更新 NSManagedObjects

如何按插入的顺序获取 NSManagedObjects?