尝试与核心数据建立一对多的关系而进展甚微。
试图制作一个简单的核心数据示例。
实体A =类型: typeName = String。
实体B =常规: routineName = String。
关系:类型有很多例程。
我有一些视图控制器。
TypeViewController(表视图控制器列出实体A中的所有类型。
AddTypeViewController(View控制器通过typeTextField向实体添加类型。这是从TypeViewController中的添加按钮推送的)
RoutineViewController(从TypeViewController中选择类型时推送的表视图控制器。列出与所选类型关联的实体B中的例程。
AddRoutineViewController(视图控制器通过routineNameTextField将例程添加到实体B。这是从RoutineView控制器中的添加按钮推送的。
我开始实现第一个实体,并设法让前2个视图控制器正常工作。 (能够在第一个视图控制器上添加类型并查看它们。
一旦我创建了第二个实体并链接了关系(也是反向关系),第一部分就停止了工作。
Q值。我是否必须更改视图控制器1中的数据获取方式? (在此视图控制器中,我只从实体A获取数据)。
Q值。是否可以单独添加数据? (从视图控制器2添加类型数据,并从视图控制器4添加例程数据。)
Q值。在视图控制器4中保存数据时......
- (IBAction)savePressed:(id)sender {
RoutinePlan *routinePlan = [[RoutinePlan alloc] initWithEntity:[NSEntityDescription entityForName:@"RoutinePlan" inManagedObjectContext:self.managedObjectContext]
insertIntoManagedObjectContext:self.managedObjectContext];
[routinePlan setValue:self.rNameTextField.text forKey:@"rName"];
**How to add this routine to the selected type**
NSError *savingError;
if (![self.managedObjectContext save:&savingError])NSLog(@"Error saving: %@", savingError);
}
感谢您的帮助。如果需要更多信息,我可以提供......
也有人知道一对多关系的基本例子吗?
编辑:
*** TypeViewController.m的代码片段
- (NSManagedObjectContext *)managedObjectContext{
NSManagedObjectContext *context = nil;
id delegate = [[UIApplication sharedApplication] delegate];
if ([delegate performSelector:@selector(managedObjectContext)]) {
context = [delegate managedObjectContext];
}
return context;}
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
if ([[segue identifier] isEqualToString:@"current Type Selected"]) {
NSManagedObject *selectedRoutine = [self.routineTypeArray objectAtIndex:[[self.tableView indexPathForSelectedRow] row]];
RoutinePlanViewController *destViewController = segue.destinationViewController;
destViewController.routineTypeObject = selectedRoutine;
}}
- (void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
// Fetch the devices from persistent data store
NSManagedObjectContext *managedObjectContext = [self managedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Type"];
self.routineTypeArray = [[managedObjectContext executeFetchRequest:fetchRequest error:nil] mutableCopy];
[self.tableView reloadData];}
** AddTypeViewController.m的代码片段
- (NSManagedObjectContext *)managedObjectContext {
NSManagedObjectContext *context = nil;
id delegate = [[UIApplication sharedApplication] delegate];
if ([delegate performSelector:@selector(managedObjectContext)]) {
context = [delegate managedObjectContext];
}
return context;}
- (IBAction)savePressed:(id)sender {
NSManagedObjectContext *context = [self managedObjectContext];
NSManagedObject *newRoutine = [NSEntityDescription insertNewObjectForEntityForName:@"Type" inManagedObjectContext:context];
[newRoutine setValue:self.rTypeTextField.text forKey:@"rType"];
NSError *error = nil;
if (![context save:&error]) {
NSLog(@"Can't Save! %@ %@", error, [error localizedDescription]);
}
[self dismissViewControllerAnimated:YES completion:nil]; }
** RoutineViewController.m的代码片段
@synthesize routineTypeObject;
- (NSManagedObjectContext *)managedObjectContext{
NSManagedObjectContext *context = nil;
id delegate = [[UIApplication sharedApplication] delegate];
if ([delegate performSelector:@selector(managedObjectContext)]) {
context = [delegate managedObjectContext];
}
return context;
}
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:@"current Type Selected"]) {
AddRoutineViewController *destViewController = segue.destinationViewController;
destViewController.routineTypeObject = routineTypeObject;
}
}
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
// Fetch the devices from persistent data store
NSManagedObjectContext *managedObjectContext = [self managedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Routine"];
self.routineArray = [[managedObjectContext executeFetchRequest:fetchRequest error:nil] mutableCopy];
[self.tableView reloadData];
}
** AddRoutineViewController.m的代码片段
@synthesize routineTypeObject;
- (NSManagedObjectContext *)managedObjectContext {
NSManagedObjectContext *context = nil;
id delegate = [[UIApplication sharedApplication] delegate];
if ([delegate performSelector:@selector(managedObjectContext)]) {
context = [delegate managedObjectContext];
}
return context;
}
- (IBAction)savePressed:(id)sender {
Routine *routinePlan = [[Routine alloc] initWithEntity:[NSEntityDescription entityForName:@"Routine" inManagedObjectContext:self.managedObjectContext]
insertIntoManagedObjectContext:self.managedObjectContext];
[routinePlan setValue:self.rNameTextField.text forKey:@"rName"];
**Error
[Routine.Type = routineTypeObject];
NSError *savingError;
if (![self.managedObjectContext save:&savingError])NSLog(@"Error saving: %@", savingError);
}
答案 0 :(得分:0)
Q值。我是否必须更改视图控制器1中的数据获取方式? (在此视图控制器中,我只从实体A获取数据)。
不,你不应该(但你没有提供有关你目前如何做或任何错误的信息)。
Q值。是否可以单独添加数据? (从视图控制器2添加类型数据,并从视图控制器4添加例程数据。)
是的,只要您引用正在编辑的type
并添加managedObjectContext
,就没有基于视图控制器的限制。
Q值。在视图控制器4中保存数据时......
您需要添加配置关系的行。最简单的方法是:
routinePlan.type = type;
(其中routinePlan
具有名为type
的关系,并且您具有要编辑的实例。使用点表示法还要求您具有托管对象子类。)