为了将一些逻辑包装到模型中,我计划将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模型?
答案 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
添加到托管对象类,则不必(或甚至可能导致问题)。