关于核心数据的两个问题

时间:2013-09-07 15:13:38

标签: ios objective-c core-data

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

我有一个带有两个ViewController的TabBarController。在第一个我想记录一个时间,应该存储。在第二个中有一个显示所有记录的TableView。我按照教程中的说法做了,并在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];
}

但是当我多次使用这个变量时(也在同一个类中)我得到一个(某种nullpointer)错误:

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

调试时我发现这里的managedObjectContext为null:

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

这是什么问题?什么是观点的最佳解决方案?

是否可以使用单身人士?

- (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。是否可以存储与数据模型不同的对象?

我需要我的班级不要存储我的其他物品。就像一个我不想保存的数组。这可能吗?

1 个答案:

答案 0 :(得分:2)

1。 您正在使用tabbarcontroller。该标签栏上的viewControllers需要具有属性,例如managedObjectContext。 如果您通过storyboard或nib使用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,以及嵌入在NavigationController中的那个。 这应该照顾第一个错误。你需要很好地理解你的viewController层次结构(注意:viewController层次结构不等于视图层次结构)。

在这种情况下,使用单身人士可以解决您不完全理解的问题,因此也是不明智的。有些情况下单身人士会很完美,但现在你的appDelegate可以很好地履行这个角色。

2。 我不清楚你在这里的意思。未在数据模型中定义的对象无法存储在核心数据中。但是,您可以将对象保存在不同的模型中(使用自己的核心数据堆栈)。或者以其他方式坚持他们。但我想你的意思是别的。 假设您的意思是您有一些无需保存的managedOjects'Class',您可以创建一个辅助MOC,而不是保存它。您还可以将其设置为原始MOC的子级,因此它将获取原始mod的持久存储中存在的所有数据,但新对象将仅存在于子MOC中。保存子MOC会将新对象移动到原始MOC中,并保存该对象将其保留在磁盘上。 同样,我不确切地知道你对第二个问题的意思。