【问题标题】:relationship fault (core data)关系故障(核心数据)
【发布时间】:2012-09-07 21:17:55
【问题描述】:

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

我有两个实体:Talk 和 Speaker。他们有一对多的关系。

谈话 - 目的地:演讲者,反向:谈话 演讲者 - 目的地:谈话,反向:演讲者

在两个实体上都选中了“多对多关系”字段。

我有一个表格视图控制器来列出所有可用的谈话。我就是这样做的:

- (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);
}

它永远不会进入 for。

如果我尝试记录 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";
})

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

有什么建议吗?

【问题讨论】:

  • Relationship Fault 并不意味着错误,您​​是否尝试过从扬声器记录属性?看到这个答案:stackoverflow.com/a/8876336/879119
  • 试过了,但没用。根据您指出的答案无法解决我的问题。不过谢谢。
  • 你能记录下 self.talkInfo 吗?所以我可以看到它的结构
  • 这里是:信息:(实体:Talk;id:0x6e66880 ;数据: { date = "2012-08-31 03:00:00 +0000"; id = 7; speaker = ""; "start_time" = "17:14:55"; } )
  • 那么是一对一的关系吗?

标签: ios core-data relationship fault


【解决方案1】:

首先使用 SQLite 浏览器 (here if you dont have one) 检查对象。并确保数据存储在核心数据中。在~/Library/Application\ Support/iPhone\ Simulator/XX/Applications/XXXXXXXXXXX/Documents/XXXX.sqlite 访问模拟器文件。确保ZTALKS table 有一个column ZSPEAKER 和一个值,这应该对应于Z_PK 中的Z_PKZSPEAKER 表格。如果是这样,则关系是连接的。

您的模型应该如下所示:

当你有这样的 Talk 对象时:

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

你应该可以像这样抓住它的扬声器:

Speaker *speaker = talk.speaker;

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

【讨论】:

  • ZTALKS 上没有 ZSPEAKER 列。当我没有设置多对多关系时创建此列。当我设置时,不会创建该列。所有信息都来自 JSON,格式如下:“date”:“2012-11-02”,“id”:“8”,“name”:“Java”,“speaker”:[“/api/v1 /speaker/1/", "/api/v1/speaker/2/" ], 我如何保存数组: if ([value isKindOfClass:[NSArray class]]) { NSSet *valueSet = [NSSet setWithArray:value]; [managedObject setValue:valueSet forKey:key]; }
猜你喜欢
  • 2010-12-22
  • 2012-10-24
  • 2012-10-14
  • 1970-01-01
  • 1970-01-01
  • 2012-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多