传递核心数据对象而不保存

Posted

技术标签:

【中文标题】传递核心数据对象而不保存【英文标题】:passing core data object without saving 【发布时间】:2016-05-09 01:12:56 【问题描述】:

我正在尝试将核心数据对象从一个控制器传递到另一个控制器而不保存更改。但我得到CoreData:错误:变异托管对象0x14f70f510

代码如下:

- (void) collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath 

NSManagedObjectContext *localContext = [NSManagedObjectContext MR_context];
Item *item  = [Item MR_createEntityInContext:localContext];
item.code = indexPath.row;

NextController *controller = [[NextController alloc] initWithItem:item];
[self.navigationController pushViewController:controller animated:YES];

我不想立即保存数据的原因是我想等到用户完成创建新项目的过程。

【问题讨论】:

马上保存并在里面放个flag说它已经完成了,这样会容易得多,你可以移动NSManagedObjects,但是很痛苦 【参考方案1】:

试试这个:

当你选择一个项目时调用执行一个转场

- (void) collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath 

    [self performSegueWithIdentifier:@"mySegue" sender:sender];


创建 NSManagedObject 并将其传递给您要推送到的视图控制器。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

    if ([[segue identifier] isEqualToString:@"mySegue"])  
        NSIndexPath *path = [self.tableView indexPathForSelectedRow];

        NSManagedObjectContext *localContext = [NSManagedObjectContext MR_context];
        Item *item  = [Item MR_createEntityInContext:localContext];
        item.code = path.row;

        CustomViewController *vc = [segue destinationViewController]
        [vc theNameOfTheNSManagedObjectInTheVCYouPushTo: item]
    

【讨论】:

我没有使用故事板,所以我不能这样做。我试过 NextController *controller = [[NextController alloc] init];控制器.item = 项目; [self.navigationController pushViewController:控制器动画:YES];但它仍然给我核心数据错误。【参考方案2】:

在每次整个操作后保存它,这是MagicalRecord 推荐的,因为您的应用可能随时崩溃或被用户终止。 还有一件事,[item MR_inContext:localContext] 将获得该项目的永久对象 ID。这可能会有所帮助。

【讨论】:

谢谢,但我不保存就通过它的目的是我不想存储不必要的数据。我只想在用户完成整个流程时保存它。我可以通过创建常规对象来做到这一点,但由于我已经有了包含核心数据的数据模型,所以做两次似乎是多余的。【参考方案3】:

您正在 localContext 中创建新实体,如果您想对它做一些事情,您还应该将此 localContext 作为参数传递。

我的意思是下一个:

NextController *controller = [[NextController alloc] initWithItem:item];

用作:

NextController *controller = [[NextController alloc] initWithItem:item yourLocalContext:localContext];

在这种情况下,您可以更改您的项目

【讨论】:

以上是关于传递核心数据对象而不保存的主要内容,如果未能解决你的问题,请参考以下文章

在插入新的子对象时,父子对象传递与多级的一对多关系。 IOS核心数据

核心数据保存竞争条件错误

初始化托管对象而不插入托管对象上下文时,核心数据对象属性为零

核心数据:从详细视图编辑对象

我们可以在AppDelegate中实例化核心数据的单个对象并在整个应用程序中使用它吗?

无法保存到核心数据中