appDelegate的CoreData问题

时间:2011-01-11 22:05:20

标签: objective-c cocoa

我对Objective C相对较新。到目前为止,在我击中CoreData之前,一切都进展顺利。我只是无法让它工作!花了很多时间做一些看起来非常简单的事情后,我的斗智尽头。

请帮我弄清楚我做错了什么:

  • 我创建了一个新的基于Windows的应用,并选中了“使用Core Data进行存储”
  • 在xcdatamodel中,我创建了一个名为'RecipeData'的实体,只有一个属性'recipeName',它是一个字符串
  • 在app委托中,我加载了一个XML文件并解析它。当我解析配方名称时,我使用以下内容:

recipeData *dataName = (recipeData *) [NSEntityDescription insertNewObjectForEntityForName:@"RecipeData" inManagedObjectContext:managedObjectContext];

我收到以下错误:

terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '+entityForName: could not locate an NSManagedObjectModel for entity name 'RecipeData'

这引出了我的三个大问题:

  • 有什么事情显而易见我做错了吗?
  • 因为我选中了'使用Core Data进行存储',所以似乎以下代码会自动注入到app delegate中.h:

    @private             NSManagedObjectContext * managedObjectContext _;

            NSManagedObjectModel *managedObjectModel_;
    
            NSPersistentStoreCoordinator *persistentStoreCoordinator_;
    

    @property(nonatomic,retain,readonly)NSManagedObjectContext * managedObjectContext;

这会干扰我正在使用的代码吗?

  • 我尝试创建一个名为* myManagedObjectContext的新NSManagedObjectContext,但是没有用。

另外一个小问题,当我在我的代码上方添加以下内容时:

if(managedObjectContext == nil){

NSLog(@“NO CONTEXEX”);
}

控制台打印“NO CONTEXT”

我非常感谢任何帮助。感谢。

1 个答案:

答案 0 :(得分:0)

managedObjectContext来自哪里?这是managedObjectContext_的拼写错误吗?项目模板创建后者,而不是前者。使用上面的代码和标准项目模板提供的代码应该会产生语法错误。我猜你已经重命名了一些东西?

您好像使用managedObjectContext作为ivar。这是一个属性。在类中,有一个私有的managedObjectContext_ ivar,它保存对象上下文的引用。你不应该访问它。您应该访问managedObjectContext属性。首次访问此属性时,其getter方法将为您创建上下文。由于您没有访问该属性,因此不会调用getter方法,也不会创建上下文。

你有这样的代码:

recipeData *dataName = (recipeData *) [NSEntityDescription insertNewObjectForEntityForName:@"RecipeData" inManagedObjectContext:managedObjectContext];

...你应该使用这样的代码:

recipeData *dataName = (recipeData *) [NSEntityDescription insertNewObjectForEntityForName:@"RecipeData" inManagedObjectContext:self.managedObjectContext];

注意self.位。这意味着您正在访问self对象上的属性,而不是从调用该方法的对象访问ivar。

请注意,读取属性与调用getter方法相同,因此上面的内容也可以写成:

recipeData *dataName = (recipeData *) [NSEntityDescription insertNewObjectForEntityForName:@"RecipeData" inManagedObjectContext:[self managedObjectContext]];