2012-09-14 135 views
0

我是核心数据的新手,我需要以下问题的帮助:关系错误(核心数据)

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

讲座 - 目的地:喇叭,逆:谈 音箱 - 目的地:谈话,反:扬声器

场“一对多关系”是在两个实体进行检查。

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

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

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

任何提示?

+0

关系错误并不意味着错误,你有没有尝试从扬声器记录属性?看到这个答案:http:// stackoverflow。com/a/8876336/879119 – mkral

+0

试过了,但没有奏效。根据您指出的答案无法解决我的问题。但是,谢谢。 – hdoria

+0

你能记录self.talkInfo吗?所以我可以看到它的结构如何: – mkral

回答

1

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

你的模型应该是这个样子:

enter image description here

当你有一个像谈话对象,因此:

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

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

Speaker *speaker = talk.speaker; 

我知道这与你的有点不同设置,但希望这应该有所帮助。

+0

ZTALKS上没有ZSPEAKER栏。当我不设置多对多关系时,创建此列。当我设置,列不会被创建。 所有信息来自一个JSON,格式如下: “日期”: “2012年11月2日”, “ID”: “8”, “名”: “Java” 的, “扬声器”: [ “/ API/V1 /扬声器/ 1 /”, “/ API/V1 /扬声器/ 2 /” ], 我怎样保存阵列: 如果([值isKindOfClass:[NSArray的类] ]){ NSSet * valueSet = [NSSet setWithArray:value]; [managedObject setValue:valueSet forKey:key]; } – hdoria