关于核心数据的两个问题

1.从两个视图使用相同的Core Data上下文的最好方法是什么?

我有一个TabBarController与两个ViewController。 在第一个我想logging一个时间,应该存储。 在第二个有一个TableView显示所有logging。 我按照教程中的说法做了,并启动了App Delegate中的所有ManagedDataContext,并将其传递给Controller:

- (void)applicationDidFinishLaunching:(UIApplication *)application { SecondViewController *tableController = [[SecondViewController alloc] init]; tableController.managedObjectContext = [self managedObjectContext]; self.navigationController = [[UINavigationController alloc] initWithRootViewController:tableController]; [window addSubview: [self.navigationController view]]; [window makeKeyAndVisible]; } 

但是,当我多次使用这个variables(也是在同一个类)时,我得到了(某种types的空指针)错误:

 *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '+entityForName: nil is not a legal NSManagedObjectContext parameter searching for entity name 'Event'' 

debugging时,我发现这里的managedObjectContext为null:

 NSEntityDescription *entity = [NSEntityDescription entityForName:@"Event" inManagedObjectContext:managedObjectContext]; 

这里有什么问题? 什么是最佳的解决scheme的意见?

有没有可能使用单身人士?

 - (NSManagedObjectContext *) managedObjectContext { if (managedObjectContext != nil) { NSLog(@"managedObjectContext already in use. Returning instance."); return managedObjectContext; } NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; if (coordinator != nil) { managedObjectContext = [[NSManagedObjectContext alloc] init]; [managedObjectContext setPersistentStoreCoordinator: coordinator]; } NSLog(@"managedObjectContext nil. Returning new instance."); return managedObjectContext; } 

2.是否可以存储与数据模型不同的对象?

我需要我的class级不要存储我的其他对象。 像一个数组,我不想保存。 这可能吗?

1.您正在使用tabbarcontroller。 该标签栏上的viewControllers需要有属性,例如managedObjectContext。 如果您通过故事板或笔尖使用tabbarcontroller,则可以通过tabbarcontroller上的viewControllers属性获取viewControllers,并设置managedObjectContext:

 UITabBarController * tabBarController = (UITabBarController *) self.window.rootViewController; // the first tab is a navcontroller, which contains as a rootVC a custom VC with a property for the MOC UINavigationController * navController = (UINavigationController *)[tabBarController.viewControllers objectAtIndex:0]; MyViewController1 * rootVCOfNavController = (MyViewController1 *) [[historyNavigationController viewControllers] objectAtIndex: 0]; // the second tab of the tabbarcontroller is a custom VC with a MOC property MyViewController2 * viewController2 = (MyViewController2 *)[tabBarController.viewControllers objectAtIndex:1]; viewController1 = self.managedObjectContext; rootVCOfNavController.managedObjectContext = self.managedObjectContext; 

这将确保第一个“裸”viewController获得一个MOC,并embedded在一个NavigationController。 这应该照顾第一个错误。 你需要理解你的viewController层次(注意:viewController层次结构不等于view-hierarchy)。

在这种情况下,使用单例可以解决您不完全了解的问题,因此不太明智。 有些情况下,单身是完美的,但现在你的appDelegate可以很好地履行这个职责。

我不清楚你在这里的意思。 在数据模型中未定义的对象不能存储在核心数据中。 但是,您可以将对象保存在不同的模型中(使用自己的核心数据堆栈)。 或者坚持他们一些其他的方式。 但是我猜你的意思是别的。 假设你的意思是你有一些managedOjects'Class'不需要保存,你可以创build一个辅助的MOC,而不需要保存它。 您也可以将其设置为原始MOC的子项,因此它将获取该原始模块的持久存储中存在的所有数据,但新对象只会出现在子MOC中。 保存一个孩子MOC将把新的对象上移到原始的MOC中,并保存这个对象将它们保存到磁盘上。 再一次,我不清楚第二个问题是什么意思。