CoreData返回带有空对象的集合。

时间:2014-03-21 09:44:08

标签: ios iphone core-data relationship

我在最后一天一直在研究这个问题,所以我觉得是时候提问了。

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

object http://i57.tinypic.com/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的父级中的indexPath.row处检索具有索引的子节点。

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;

联系人的姓名不会显示出来,我在这里有点绝望。还有其他见解吗?

2 个答案:

答案 0 :(得分:1)

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

这一行:

NSArray *contacts = [section.children allObjects];

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

您可以更改要订购的关系,也可以对所获得的数组进行排序。在调用objectAtIndex:之前,您需要执行其中一项操作才能返回合理的结果。

答案 1 :(得分:0)

实体的NSManagedObject类不正确。 我不知道为核心数据实体自动生成这些对象的工具。

新文件..>核心数据> NSManagedObject子类>选择正确的Datamodel>选择正确的实体。