我正在玩,学习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;
}
干杯杰夫
答案 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
与核心数据模型联系起来。