从AppDelegate获取managedObjectContext

时间:2013-07-24 11:29:33

标签: cocoa core-data

我正在尝试从mac平台(而不是iOS)上的 managedObjectContext 获取AppDelegate来执行一些CoreData操作。由于SO上已经指出了许多答案(尽管主要针对iOS),但有一些选项可以创建单例来访问managedObjectContext或向我想要访问它的每个控制器添加managedObjectContext属性。<登记/> 我已经完成了后者,但每当我尝试基于某个实体创建一个托管对象时,我都会收到以下错误:+entityForName: nil is not a legal NSManagedObjectContext parameter searching for entity

这是我到目前为止所做的事情:
ViewController.h:

@interface HitpointsTableViewConroller : NSObject <NSTableViewDataSource> {
IBOutlet NSTableView *tableView;
NSMutableArray *list;
}

@property NSManagedObjectContext *managedObjectContext;

该控制器的Init方法获取managedObjectContext

- (id)init {
if (self = [super init]) {
    // get the managedObjectContext
    NSManagedObjectContext *currentContext = [[NSApp delegate]managedObjectContext];
    self.managedObjectContext = currentContext;

    hitpointsList = [[NSMutableArray alloc]init];
}

return self;
}

我创建NSManagedObject的新实例的方法:

- (IBAction)addItem:(id)sender {
  // create new item
  Item *item = (Item *)[NSEntityDescription   
  insertNewObjectForEntityForName:@"Item"   
  inManagedObjectContext:[self managedObjectContext]];

  // set defaults for that item
  [item setName:@"Coffee"];
  [item setPrice:2.99];

  // add hitpoint to list
   [list addObject:item];
   }

为什么这不起作用?

谢谢!

1 个答案:

答案 0 :(得分:1)

首先:你的财产没有属性。 AFAIK,“atomic”是默认值,对大多数对象来说都是坏事。

第二:如果你总是从app-delegate获得MOC,为什么要将它分配给一个属性?在你的addItem方法中,只需从代理而不是属性中获取你的MOC。

第三:如果从委托中获取MOC仍然会导致nil-error,那么显然需要检查委托中的方法。

(最初将此作为评论发布,但由于评论不允许段落格式化,我将其重新发布为答案)