试图让我的核心数据显示在我的应用程序中

时间:2012-04-14 02:27:44

标签: ios core-data storyboard

我正在玩,学习CoreData,当我得到一个以UITableView为根的测试应用程序时,它显示数据正常。这将告诉我它正在从中提取数据的数据库设置正确。

现在我正在尝试将UIViewController作为初始视图控制器(通过Story board)并且它一直给我这个错误 -

  

无法使用nil模型

创建NSPersistentStoreCoordinator

现在我已经阅读了很多论坛和教程,他们基本上都说我需要确保我的xcdatamodel文件与此匹配

  

URLForResource:@“Model”withExtension:@“momd”]

如果UITableView是根视图,我可以再次显示数据。

现在,如果我改变:

- (NSManagedObjectModel *)managedObjectModel
{
if (__managedObjectModel != nil)
{
    return __managedObjectModel;
}
  NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"Model"     withExtension:@"momd"];
__managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
return __managedObjectModel;
}

进入这个:

- (NSManagedObjectModel *)managedObjectModel
{
if (__managedObjectModel != nil)
{
    return __managedObjectModel;
}
  //NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"Model"   withExtension:@"momd"]; // I have commented out this line because the NSURL is no longer being used.
__managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:nil];
return __managedObjectModel;
 }

应用程序运行但TableView为空,这对我来说很有意义,因为我没有链接到CoreData文件。 - 问题是 - 如何使用我所拥有的设置运行应用程序并显示数据?

干杯杰夫


回应Jeff Wolski的第一个回答

感谢您的回答,我认为我走的是正确的道路 - 我不得不稍微改变一下我的项目以消除错误。我知道有

AppDelegate appDelegate = (AppDelegate) [[UIApplication sharedApplication] delegate]; 

所以我说这是

- (NSManagedObjectModel *)managedObjectModel {

区域 - 这是正确的吗?另外它现在已经拿出appDelegate变量未使用警告。可能是一个简单的问题,但我现在在哪里使用该变量?干杯杰夫


我已经发布了我认为你在@Jody Hagins之后的样子 - 希望它有所帮助: - )

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
if (__persistentStoreCoordinator != nil)
{
    return __persistentStoreCoordinator;
}

NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"ViewToNav.sqlite"];

NSError *error = nil;
__persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];


NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                         [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
                         [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];
if (![__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error])
{

    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    abort();
}    

return __persistentStoreCoordinator;
}

干杯杰夫

1 个答案:

答案 0 :(得分:1)

您需要在应用代理中设置所有核心数据。托管对象模型必须是您的视图可以访问的应用程序委托中的属性。在视图控制器中,您可以使用

获取应用程序代理的挂钩
MyAppDelegate *appDelegate = (MyAppDelegate*) [[UIApplication sharedApplication] delegate];

这将允许您从任何您喜欢的视图控制器执行提取。

编辑:

我们需要在视图控制器中拥有appDelegate的原因是我们可以访问应用委托中的NSManagedObjectContext。因此,您无需将NSManagedObjectModel放在视图控制器中。 NSManagedObjectContext(MOC)使您可以访问应用程序委托中已存在的整个核心数据堆栈。

在您的app代理中,您的MOC应设置为属性。现在,您可以在视图控制器中执行此操作。

myMOC = appDelegate.MOC;

现在myMOC可让您访问核心数据。您将在视图控制器中创建NSFetchedResultsController作为属性。在您的getter方法中,其中一个步骤是创建NSEntityDescription。您可以在此处使用self.myMOC,从而将NSFetchedResultsController与核心数据模型联系起来。