0

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

现在我试图将 UIViewController 作为初始视图控制器(通过故事板),它一直给我这个错误 -

无法使用 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 文件。- 问题是 - 我如何使用我所拥有的设置运行应用程序并显示数据?

干杯杰夫


@response 对 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;
}

干杯杰夫

4

1 回答 1

1

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

MyAppDelegate *appDelegate = (MyAppDelegate*) [[UIApplication sharedApplication] delegate];

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

编辑:

我们需要appDelegate在视图控制器中使用的原因是我们可以访问NSManagedObjectContext应用程序委托中的那个。所以你不需要把它NSManagedObjectModel放在你的视图控制器中。( NSManagedObjectContextMOC) 使您可以访问应用程序委托中已经存在的整个核心数据堆栈。

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

myMOC = appDelegate.MOC;

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

于 2012-04-14T03:45:37.243 回答