关系错误(核心数据)

时间:2012-09-14 17:11:16

标签: ios core-data relationship fault

我是核心数据的新手,我需要帮助解决以下问题:

我有两个实体:Talk和Spe​​aker。他们有很多关系。

对话 - 目的地:扬声器,反向:说话 扬声器 - 目的地:对话,反向:扬声器

在两个实体上检查“To-Many Relationship”字段。

我有一个表视图控制器列出所有可用的会话。这就是我在做什么:

- (NSFetchedResultsController *)fetchedResultsController
{
    if (_fetchedResultsController != nil) {
        return _fetchedResultsController;
    }

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription
                                   entityForName:@"Talk" inManagedObjectContext:self.managedObjectContext];
    [fetchRequest setEntity:entity];

    NSSortDescriptor *sort = [[NSSortDescriptor alloc]
                              initWithKey:@"date" ascending:NO];
    [fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]];
    [fetchRequest setFetchBatchSize:20];

    NSFetchedResultsController *theFetchedResultsController =
    [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                        managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil
                                                   cacheName:@"Root"];
    self.fetchedResultsController = theFetchedResultsController;
    _fetchedResultsController.delegate = self;

    return _fetchedResultsController;
}

当我点击一个单元格时,我想加载另一个视图控制器,只显示所选谈话的详细信息。

这就是我在做的事情:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    TalksDetailsViewController *talksDetails = [[TalksDetailsViewController alloc] initWithTalksInfo:[_fetchedResultsController objectAtIndexPath:indexPath]];
    [self.navigationController pushViewController:talksDetails animated:YES];
}

问题是:我在TalksDetailsViewController上看不到扬声器。这是发送给TalksDetailsViewController的信息:

Info: <Talk: 0x6e66920> (entity: Talk; id: 0x6e66880 <x-coredata://4063FE84-E6DB-4588-8133-9A55B512D6C8/Talk/p2> ; data: {
    date = "2012-08-31 03:00:00 +0000";
    id = 7;
    speaker = "<relationship fault: 0x6e994e0 'speaker'>";
    "start_time" = "17:14:55";
})

我尝试了下面的代码,但是没有用:

for (Speaker *speakerInfo in self.talkInfo.speaker) {
        NSLog(@"speaker info: %@", speakerInfo);
}

它永远不会进入。

如果我尝试记录self.talkInfo.speaker,我会得到类似的内容:

Relationship 'speaker' fault on managed object (0x7a76c30) <Talk: 0x7a76c30> (entity: Talk; id: 0x7a76b90 <x-coredata://4063FE84-E6DB-4588-8133-9A55B512D6C8/Talk/p2> ; data: {
    date = "2012-08-31 03:00:00 +0000";
    id = 7;
    speaker = "<relationship fault: 0x6bc5990 'speaker'>";
    "start_time" = "17:14:55";
})

我看到了一些类似的问题,但无法解决我的问题。

任何提示?

1 个答案:

答案 0 :(得分:1)

首先使用SQLite浏览器(here if you dont have one)检查对象。并确保数据存储在核心数据中。访问~/Library/Application\ Support/iPhone\ Simulator/XX/Applications/XXXXXXXXXXX/Documents/XXXX.sqlite处的模拟器文件。确保ZTALKS 表格包含 ZSPEAKER及其值,这应该与Z_PK值相对应ZSPEAKER 表格。如果它确实关系是连接的。

你的模型应该是这样的:

enter image description here

如果您有这样的Talk对象:

 Talk *talk = [**YourManagedObjectContext**  executeFetchRequest:fetchRequest error:&error];

你应该能够像这样抓住它的扬声器:

Speaker *speaker = talk.speaker;

我知道这与您的设置略有不同,但希望这会有所帮助。