CoreData:错误:无法在 NSManagedObject 类“Collect”上调用指定的初始化程序
Posted
技术标签:
【中文标题】CoreData:错误:无法在 NSManagedObject 类“Collect”上调用指定的初始化程序【英文标题】:CoreData: error: Failed to call designated initializer on NSManagedObject class 'Collect' 【发布时间】:2013-02-05 07:51:34 【问题描述】:为了将一些逻辑封装到模型中,我打算将 NSManagedObjectContext 放在一个 NSManagedObject 模型中,这样我就可以在一个模型中处理许多常见的逻辑:
@interface Collect : NSManagedObject
NSManagedObjectContext *managedObjectContext;
@property (nonatomic, retain) NSNumber *created_at;
@property (nonatomic, retain) NSString *name;
- (void) initContext;
@end
@implementation Collect
@dynamic created_at;
@dynamic name;
- (void) initContext
if (managedObjectContext == nil)
managedObjectContext = [MyAppDelegate managedObjectContext];
@end
我使用它:
Collect *collect = [[Collect new] autorelease];
[collect initContext];
但运行时显示:CoreData: error: Failed to call designated initializer on NSManagedObject class 'Collect'
。
我想知道如何正确地将 NSManagedObjectContext 实例添加到 NSManagedObject 模型?
【问题讨论】:
【参考方案1】:您不能将托管对象上下文添加到托管对象,它的工作方式相反:您首先需要托管对象上下文,然后您可以在此上下文中创建对象。
参见例如NSManagedObjectContext
文档:
NSManagedObjectContext
的实例表示单个“对象 空间”或应用程序中的便签本。它的主要职责是 管理托管对象的集合。这些对象形成一个组 表示内部一致视图的相关模型对象 一个或多个持久性存储。 单个托管对象实例存在于一个且仅一个上下文中,但对象有多个副本 可以存在于不同的上下文中。
和NSManagedObject
文档:
如果你直接实例化一个托管对象,你必须调用指定的初始化器 (
initWithEntity:insertIntoManagedObjectContext:
)。
还有一个实用方法insertNewObjectForEntityForName:inManagedObjectContext:
来创建新对象。例如:
Collect *collect = [NSEntityDescription insertNewObjectForEntityForName:@"Collect"
inManagedObjectContext:[MyAppDelegate managedObjectContext]];
(如果您愿意,可以将其放入Collect
的类方法中。)
并注意NSManagedObject
已经有一个managedObjectContext
方法来获取对象的上下文:
NSManagedObjectContect *context = [collect managedObjectContext];
因此,如果将实例变量 managedObjectContext
添加到托管对象类,则没有必要(甚至可能会导致问题)。
【讨论】:
以上是关于CoreData:错误:无法在 NSManagedObject 类“Collect”上调用指定的初始化程序的主要内容,如果未能解决你的问题,请参考以下文章
在 NSManagedObject 类中初始化 @NSManaged 变量?
在 Core Data 中,NSManaged 对象上的 URI 属性类型应该用于啥?
对于 @NSManaged 变量,fileprivate 是不是足够?