我需要使用核心数据来保存我项目的数据,到目前为止我所做的编译得很好,但是当我真正开始使用核心数据存储时,程序就退出了,我不知道原因。我在appDelegate文件中为核心数据设置了所有必需的组件,我想将数据存储在名为viewController
的{{1}}中。这就是我所做的:
DetailViewController
核心数据的所有组件都已实施
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
// Set the tab bar controller as the window's root view controller and display.
self.window.rootViewController = self.tabBarController;
[self.window makeKeyAndVisible];
//this is what I added, reference managedObjectContext in the detail view controller.
detailViewController = [[DetailViewController alloc] init];
detailViewController.managedObjectContext = [self managedObjectContext];
return YES;
}
当我尝试在详细信息视图中调用方法来存储数据时,程序退出。
- (NSManagedObjectContext *) managedObjectContext {
if (managedObjectContext != nil) {
return managedObjectContext;
}
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil) {
managedObjectContext = [[NSManagedObjectContext alloc] init];
[managedObjectContext setPersistentStoreCoordinator: coordinator];
}
return managedObjectContext;
}
- (NSManagedObjectModel *)managedObjectModel {
if (managedObjectModel != nil) {
return managedObjectModel;
}
managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];
return managedObjectModel;
}
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
if (persistentStoreCoordinator != nil) {
return persistentStoreCoordinator;
}
NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory]
stringByAppendingPathComponent: @"MyProjectName.sqlite"]];
NSError *error = nil;
persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc]
initWithManagedObjectModel:[self managedObjectModel]];
if(![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
configuration:nil URL:storeUrl options:nil error:&error]) {
/*Error for store creation should be handled in here*/
}
return persistentStoreCoordinator;
}
- (NSString *)applicationDocumentsDirectory {
return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
}
-(IBAction) addItem {
Info *info = [NSEntityDescription insertNewObjectForEntityForName:@"Info"
inManagedObjectContext:managedObjectContext];
info.name = item.name;
}
是详细视图中的当前对象,item
是模型类文件。我在这里想念一下吗?
谢谢!
更新
控制台中的错误消息是:
由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'+ entityForName:无法找到实体名称'Info''的NSManagedObjectModel
但是我在“Resources”文件夹中有一个Info.xcdatamodel文件,实体名称是“Info”。
答案 0 :(得分:1)
您是否致电[self.managedObjectContext save:&error]
?
此外,您的捆绑加载例程可能无法正常工作。尝试加载managedObjectContext,如下所示:
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"ModelName"
withExtension:@"momd"];
__managedObjectModel = [[NSManagedObjectModel alloc]
initWithContentsOfURL:modelURL];
return __managedObjectModel;
答案 1 :(得分:0)
我的猜测是,在您的详细视图控制器中,您要么没有合成managedObjectContext
,要么在创建详细视图控制器时没有初始化它。检查这两个都在完成。如果这不能解决问题,请在崩溃后检查控制台输出,并在您的问题更新中发布任何相关信息。