CoreData:错误:无法在NSManagedObject类'Collect'上调用指定的初始值设定项

时间:2013-02-05 07:51:35

标签: core-data ios6

为了将一些逻辑包装到模型中,我计划将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 个答案:

答案 0 :(得分:3)

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

参见例如NSManagedObjectContext文档:

  

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

NSManagedObject文档:

  

如果直接实例化托管对象,必须调用指定的初始值设定项   (initWithEntity:insertIntoManagedObjectContext:)。

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

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

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

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

NSManagedObjectContect *context = [collect managedObjectContext];

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