【问题标题】:Two questions concerning Core Data关于Core Data的两个问题
【发布时间】:2013-09-07 15:13:38
【问题描述】:

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];
}

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

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

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

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

这里有什么问题?什么是 to view 的最佳解决方案?

是否可以使用单例?

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

我需要我的类不要存储我的类中包含的其他对象。就像我不想保存的数组一样。这可能吗?

【问题讨论】:

    标签: ios objective-c core-data


    【解决方案1】:

    1。 您正在使用标签栏控制器。该选项卡栏上的视图控制器需要具有属性,例如托管对象上下文。 如果您通过故事板或 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;
    

    这将确保第一个“裸”视图控制器获得 MOC,以及嵌入在 NavigationController 中的视图控制器。 这应该处理第一个错误。为此,您需要充分了解您的 viewController 层次结构(注意:viewController 层次结构不等于 view-hierarchy)。

    在这种情况下,使用单例可以解决您不完全理解的问题,因此是不明智的。在某些情况下单例是完美的,但现在你的 appDelegate 可以很好地完成这个角色。

    2。 我不太清楚你在这里的意思。未在数据模型中定义的对象不能存储在核心数据中。但是,您可以将对象保存在不同的模型中(具有自己的核心数据堆栈)。或者以其他方式坚持它们。但我猜你的意思是别的。 假设您的意思是您有一些不需要保存的 managedOjects 'Class',您可以制作一个辅助 MOC,并且永远不要保存它。您还可以将其设置为原始 MOC 的子对象,因此它将获取该原始 mod 的持久存储中存在的所有数据,但新对象将仅存在于子 MOC 中。保存子 MOC 会将新对象向上移动到原始 MOC 中,保存该对象会将它们持久保存到磁盘。 再说一次,我不知道你说的第二个问题到底是什么意思。

    【讨论】:

    • 首先谢谢。我更新了我的问题,也许你可以回到我的第一个错误。以及为什么我第二次使用 managedObjectContext 它是空的。
    • stackoverflow.com/questions/18675297/… 我想我会在这里删除这个问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-31
    • 2013-02-20
    • 1970-01-01
    • 2012-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多