在现有项目中使用核心数据
Posted
技术标签:
【中文标题】在现有项目中使用核心数据【英文标题】:Using core data in an existing project 【发布时间】:2011-09-29 12:39:03 【问题描述】:我需要使用核心数据来为我的项目持久化数据,到目前为止我所做的编译都很好,但是当我真正开始使用核心数据存储东西时,程序就退出了,我不知道原因。我在 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 传递给它。
【参考方案1】:
你打电话给[self.managedObjectContext save:&error]
了吗?
另外,您的包加载例程可能无法正常工作。尝试像这样加载 managedObjectContext:
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"ModelName"
withExtension:@"momd"];
__managedObjectModel = [[NSManagedObjectModel alloc]
initWithContentsOfURL:modelURL];
return __managedObjectModel;
【讨论】:
嗨,我找不到以“momd”扩展名结尾的文件或目录,现在我又遇到了另一个问题,当我删除原始模型文件并在它,错误说“无法合并具有两个不同实体的模型”。 似乎您的项目文件在引用其他文件夹中的托管对象模型时被搞砸了。删除磁盘和项目资源管理器中对模型的所有引用(我认为这是错误)。然后重新创建。也重置 ios 模拟器。这应该可以解决这个困惑。 啊,终于解决了,把“momd”改成“mom”就好了……谢谢~【参考方案2】:我的猜测是,在您的详细视图控制器中,您要么没有合成managedObjectContext
,要么在创建详细视图控制器时没有初始化它。检查这两项是否都已完成。如果这不能解决问题,请在崩溃后检查控制台输出,并在此处发布任何相关信息以更新您的问题。
【讨论】:
我已经在.m文件中合成了它,我没有初始化它,因为我已经在appDelegate文件中引用了它,并且将appDelegate中的managedObjectContext分配给了详细视图控制器之一。以上是关于在现有项目中使用核心数据的主要内容,如果未能解决你的问题,请参考以下文章