我有一个关于核心数据的基本问题。
我有一对多的2张桌子。
我已经设置了应用程序以将子项添加到父项,但我无法理解如何设置关系,以便当我通过视图控制器添加新子项时,它将子项添加到正确的父项。
我已经生成了实体子类,并设法让应用程序添加一个子项(但它将它添加到索引0),但我似乎无法使用找到正确父级的fetchrequest。
- (IBAction)save:(id)sender {
NSManagedObjectContext *context = [self managedObjectContext];
Child *newChild = [NSEntityDescription insertNewObjectForEntityForName:@"Child" inManagedObjectContext:context];
[newChild setValue:self.childName.text forKey:@"childName"];
[newChild setValue:self.born.text forKey:@"born"];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"ParentList" inManagedObjectContext:context];
[fetchRequest setEntity:entity];
NSError *error = nil;
NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];
ParentList *parent = [fetchedObjects objectAtIndex:0]; //this adds it to the first parentList in list at index 0 not to the correct parent
NSLog(@"parent: %@ created", league);
[parent addChildObject: newChild];
//
///////////////////////////////////////////
//////index path is wrong//////////////////
///////////////////////////////////////////
}
NSError *error = nil;
// Save the object to persistent store
if (![context save:&error]) {
NSLog(@"Can't Save! %@ %@", error, [error localizedDescription]);
}
[self dismissViewControllerAnimated:YES completion:nil];
}
答案 0 :(得分:0)
您需要将父级objectID
传递给第二个视图控制器(如果我理解您的设置正确)。
在其他视图上下文中获取父级(使用NSManagedObjectContext的existingObjectWithID:error:
)
将子父级设置为获取的对象。
应该是这样的:
NSError* error = nil;
NSManagedObjectID* parentID = //the parent object id you selected
Parent* parent = [context existingObjectWithID:parentID error:&error];
if (parent) { //parent exists
Child *newChild = [NSEntityDescription insertNewObjectForEntityForName:@"Child"
inManagedObjectContext:context];
[newChild setValue:self.childName.text forKey:@"childName"];
[newChild setValue:self.born.text forKey:@"born"];
[newChild setValue:parent forKey:@"parent"];//Set the parent
} else {
NSLog(@"ERROR:: error fetching parent: %@",error);
}
修改强>
获取所选对象ID(假设您使用的是NSFetchedReaultsController
):
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
NSManagedObject *object = [[self fetchedResultsController] objectAtIndexPath:indexPath];
//Use object.objectID as the selected object id to pass to the other view controller
//what ever you need to do with the object
}