Core Data Fetch 在插入实体时保存关系(同时)
Posted
技术标签:
【中文标题】Core Data Fetch 在插入实体时保存关系(同时)【英文标题】:Core Data Fetch Save relationship while inserting entity (simultaneously) 【发布时间】:2013-04-22 00:46:01 【问题描述】:这里的第一个问题,我尝试了很多东西,但无法弄清楚。 具有 2 个实体的核心数据,双向关系
A<<---->>B
A
实体具有名称作为属性,以及关系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.Bs
的 NSLOg
为空。
【问题讨论】:
【参考方案1】:首先我相信这条线:addAEntityViewController = self.managedObjectContext;
应该是:addAEntityViewController.managedObjectContext = self.managedObjectContext;
但这也是错误的。
它应该得到你之后创建的addingContext
:addAEntityViewController.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,如何使用