Core Data Fetch 在插入实体时保存关系(同时)

Posted

技术标签:

【中文标题】Core Data Fetch 在插入实体时保存关系(同时)【英文标题】:Core Data Fetch Save relationship while inserting entity (simultaneously) 【发布时间】:2013-04-22 00:46:01 【问题描述】:

这里的第一个问题,我尝试了很多东西,但无法弄清楚。 具有 2 个实体的核心数据,双向关系

A<<---->>BA 实体具有名称作为属性,以及关系Bs

第一个控制器列出所有 A 实体,我有第二个控制器来添加 A 实体,我希望它在其关系中保存一个默认的 B

在为 segue 做准备时,我有这个代码:

if ([[segue identifier] isEqualToString:@"addAEntitySegue"]) 

    AddAEntityViewController *addAEntityViewController = [segue destinationViewController];
    addAEntityViewController.delegate = self;
    addAEntityViewController.managedObjectContext = self.managedObjectContext;

    NSManagedObjectContext *addingContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
    self.addingManagedObjectContext = addingContext;

    [addingManagedObjectContext setPersistentStoreCoordinator:[[fetchedResultsController managedObjectContext] persistentStoreCoordinator]];

   addAEntityViewController.A = [NSEntityDescription insertNewObjectForEntityForName:@"A" inManagedObjectContext:addingContext];

    UIBarButtonItem *saveButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemSave
                                                                           target:addAEntityViewController
                                                                               action:@selector(save:)];
    addAEntityViewController.navigationItem.rightBarButtonItem = saveButton;


在 addAEntityViewController 我有这个要保存

-(IBAction)save:(id)sender

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"B"                                                    inManagedObjectContext:self.managedObjectContext];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name == %@",[defaults objectForKey:@"BDefault"]];

    [fetchRequest setEntity:entity];
    [fetchRequest setPredicate:predicate];

     //Set the batch size to a suitable number
    [fetchRequest setFetchBatchSize:20];
    NSError *error;

    self.A.name = textFieldVal;

    [self.A addBObject:[[self.managedObjectContext executeFetchRequest:fetchRequest error:&error] objectAtIndex:0]];

    NSLog(@"A = %@", self.A.Bs);

    [self.delegate addAEntityViewController:self didFinishWithSave:YES];

addAEntityViewController 中,所有内容都正确保存,即使NSLog(@"A = %@", self.A.Bs); 语句显示B。但是当代理保存在第一个控制器(AEntityViewController)中时,它只保存了A.name,而不是关系A.Bs,我不知道出了什么问题。

这是委托方法:

-(void) addAEntityViewController:self didFinishWithSave:YES
if (save) 
    NSLog(@"saveworkouts");

    NSError *error;
    if (![addingManagedObjectContext save:&error]) 
        // Update to handle the error appropriately.
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        exit(-1);  // Fail
    


// release the adding managed object context
self.addingManagedObjectContext = nil;

就像我说的那样,它保存了A 实体,但不保存与B 的关系,即使与B 的关系正确保存在addAEntityViewController(第二个视图)中。 A.BsNSLOg 为空。

【问题讨论】:

【参考方案1】:

首先我相信这条线:addAEntityViewController = self.managedObjectContext; 应该是:addAEntityViewController.managedObjectContext = self.managedObjectContext;

但这也是错误的。 它应该得到你之后创建的addingContextaddAEntityViewController.managedObjectContext = addingContext;

我有点惊讶您的应用没有崩溃,因为您正在混合来自 2 个不同上下文的托管对象。

【讨论】:

你在addAEntityViewController中仍然使用了错误的上下文,它应该设置为addingContext(上下文实体A是在其中创建的) A 实体设置在 managedObjectContext 中,但直到代理将其插入到addingContext 中才插入,应该没问题。 A.name 保存没有问题。也没有插入 A.Bs 关系。我感觉在保存实体之前不会插入关系。 这就是我要澄清的。 Bs 实体在第一个视图控制器的managedObjectContext 中获取。证明使用快速修复:而不是[self.A addBObject:[[self.managedObjectContext executeFetchRequest:fetchRequest error:&error] objectAtIndex:0]]; 使用[self.A addBObject:[[self.A.managedObjectContext executeFetchRequest:fetchRequest error:&error] objectAtIndex:0]];

以上是关于Core Data Fetch 在插入实体时保存关系(同时)的主要内容,如果未能解决你的问题,请参考以下文章

将 mogenerator 与 Core Data 实体一起使用会导致保存数据存储时出错

UICollectionview 在使用 Core Data 保存实体后重新加载数据

iOS Core Data Fetch Request,如何使用

在 Core Data 中的相关实体之间传递数据时的空值

Spring Data / Hibernate 使用 Postgres 保存实体,在冲突更新某些字段时使用插入

如何将日期类型保存到 Swift Core Data 中实体的属性?