0

コア データを初めて使用するので、次の問題についてサポートが必要です。

Talk と Speaker という 2 つのエンティティがあります。それらには対多の関係があります。

トーク - 宛先: スピーカー、逆: トーク スピーカー - 宛先: トーク、逆: スピーカー

フィールド「対多関係」は、両方のエンティティでチェックされています。

利用可能なすべての講演を一覧表示するテーブル ビュー コントローラーがあります。これは私がやっている方法です:

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

セルをクリックすると、別のView Controllerをロードして、選択したトークの詳細のみを表示したい.

これは私がやっていることです:

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

同様の質問をいくつか見ましたが、問題を解決できませんでした。

任意のヒント?

4

1 に答える 1

1

最初に SQLite ブラウザでオブジェクトを調べます (持っていない場合はこちら)。また、データがコア データに格納されていることを確認します。でシミュレータ ファイルにアクセスします~/Library/Application\ Support/iPhone\ Simulator/XX/Applications/XXXXXXXXXXX/Documents/XXXX.sqliteZTALKS テーブル とその値があることを確認してください。これはテーブルの値にZSPEAKER対応している必要があります。もしそうなら、関係はつながっています。Z_PKZSPEAKER

モデルは次のようになります。

ここに画像の説明を入力

次のような Talk オブジェクトがある場合:

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

次のようにスピーカーをつかむことができるはずです。

Speaker *speaker = talk.speaker;

これがあなたの設定とは少し異なることは理解していますが、これが役立つことを願っています.

于 2012-09-14T19:32:53.697 に答える