1

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

4

1 回答 1

3

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

参见例如NSManagedObjectContext文档:

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

NSManagedObject文档:

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

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

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

(如果你愿意,你可以把它放到一个类方法中Collect。)

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

NSManagedObjectContect *context = [collect managedObjectContext];

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

于 2013-02-05T10:54:46.720 回答