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 是不是足够?

存储的属性需要一个初始值或者应该是@NSManaged

PHPhotos 和核心数据。 PHObject 使用啥 NSManaged 对象类型?

分配给@NSManaged public var locks UI