【发布时间】:2026-01-27 00:50:02
【问题描述】:
我需要使用核心数据来为我的项目持久化数据,到目前为止我所做的编译都很好,但是当我真正开始使用核心数据存储东西时,程序就退出了,我不知道原因。我在 appDelegate 文件中为核心数据设置了所有必需的组件,并且我想将数据存储在一个名为 DetailViewController 的 viewController 中。这是我所做的:
- (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 是详细视图中的当前对象,Info 是模型类文件。我在这里想念什么吗?
谢谢!
更新:
控制台中的错误信息是:
由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“+entityForName:找不到实体名称“Info”的 NSManagedObjectModel”
但我在“Resources”文件夹中有一个 Info.xcdatamodel 文件,实体名称为“Info”。
【问题讨论】:
-
您的模型中是否有实体
@"Info"?调试控制台显示什么错误? -
是的,模型文件已创建,实体名称为“Info”。
-
是
managedObjectContext != nil吗? -
调试控制台显示什么错误?
-
检查您的托管对象模型方法。您需要在此处指定模型文件,此时您将 nil 传递给它。