【问题标题】:CoreData: error: Failed to call designated initializer on NSManagedObject class 'Collect'CoreData:错误:无法在 NSManagedObject 类“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 模型?

【问题讨论】:

    标签: core-data ios6


    【解决方案1】:

    您不能将托管对象上下文添加到托管对象,它的工作方式相反:您首先需要托管对象上下文,然后您可以在此上下文中创建对象。

    参见例如NSManagedObjectContext 文档:

    NSManagedObjectContext 的实例表示单个“对象 空间”或应用程序中的便签本。它的主要职责是 管理托管对象的集合。这些对象形成一个组 表示内部一致视图的相关模型对象 一个或多个持久性存储。 单个托管对象实例存在于一个且仅一个上下文中,但对象有多个副本 可以存在于不同的上下文中。

    NSManagedObject 文档:

    如果你直接实例化一个托管对象,你必须调用指定的初始化器 (initWithEntity:insertIntoManagedObjectContext:)。

    还有一个实用方法insertNewObjectForEntityForName:inManagedObjectContext: 来创建新对象。例如:

    Collect *collect = [NSEntityDescription insertNewObjectForEntityForName:@"Collect"
                        inManagedObjectContext:[MyAppDelegate managedObjectContext]];
    

    (如果您愿意,可以将其放入Collect 的类方法中。)

    并注意NSManagedObject 已经有一个managedObjectContext 方法来获取对象的上下文:

    NSManagedObjectContect *context = [collect managedObjectContext];
    

    因此,如果将实例变量 managedObjectContext 添加到托管对象类,则没有必要(甚至可能会导致问题)。

    【讨论】:

      猜你喜欢
      • 2014-10-19
      • 2013-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-26
      • 1970-01-01
      相关资源
      最近更新 更多