Core data 插入实体时核心数据取存关系(同时)
这里的第一个问题,我已经尝试了很多东西,但都想不出来。Core data 插入实体时核心数据取存关系(同时),core-data,insert,many-to-many,entity,relationships,Core Data,Insert,Many To Many,Entity,Relationships,这里的第一个问题,我已经尝试了很多东西,但都想不出来。 具有两个实体的核心数据,两个实体之间有到多个关系 AB A实体将名称作为属性,并具有关系Bs 第一个控制器列出所有A实体,我有第二个控制器添加A实体,我想让它在其关系中保存默认B 在准备阶段,我有以下代码: if ([[segue identifier] isEqualToString:@"addAEntitySegue"]) { AddAEntityViewController *addAEntityViewController
具有两个实体的核心数据,两个实体之间有到多个关系
AB
A
实体将名称作为属性,并具有关系Bs
第一个控制器列出所有A
实体,我有第二个控制器添加A
实体,我想让它在其关系中保存默认B
在准备阶段,我有以下代码:
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
为空 首先我相信这句话:
addAEntityViewController=self.managedObjectContext代码>
应该是:
addAEntityViewController.managedObjectContext=self.managedObjectContext代码>
但这也是错误的。
它应该获得您随后创建的addingContext
:
addAEntityViewController.managedObjectContext=addingContext代码>
我有点惊讶,你的应用程序没有崩溃,因为你正在混合来自两个不同上下文的托管对象。
你仍然在addAEntityViewController
中使用错误的上下文,它应该设置为addingContext
(上下文实体a是在中创建的)A实体在managedObjectContext中设置,但在委托将其插入addingContext之前不会插入,这应该可以。保存A.name没有问题。A.Bs关系也不能插入。我有一种感觉,在实体被保存之前,关系是不会被插入的。这就是我想要澄清的。在第一个视图控制器的managedObjectContext
中获取Bs实体。要证明这一点,请使用快速修复程序:而不是[self.A addboobject:[[self.managedObjectContext executeFetchRequest:fetchRequest error:&error]objectAtIndex:0]]代码>使用[self.A addboobject:[[self.A.managedObjectContext executeFetchRequest:fetchRequest错误:&error]objectAtIndex:0]]代码>