ошибка отношения (основные данные)

Я новичок в основных данных, и мне нужна помощь в решении следующей проблемы:

У меня есть две сущности: Talk и Speaker. У них отношения ко многим.

Talk - назначение: динамик, инверсия: Talk Speaker - назначение: Talk, инверсия: динамик

Поле «Отношение ко многим» проверяется на обоих объектах.

У меня есть контроллер табличного представления, чтобы перечислить все доступные разговоры. Вот как я делаю:

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

Я видел несколько похожих вопросов, но не смог решить свою проблему.

Какие-нибудь советы?


person hdoria    schedule 14.09.2012    source источник
comment
Relationship Fault не означает ошибку, вы пытались зарегистрировать атрибут из динамика? См. этот ответ: stackoverflow.com/a/8876336/879119   -  person mkral    schedule 14.09.2012
comment
Пробовал, но не получилось. Не удалось решить мою проблему на основе указанного вами ответа. Но спасибо.   -  person hdoria    schedule 14.09.2012
comment
Можете ли вы зарегистрировать self.talkInfo? Так что я вижу, как это структурировано   -  person mkral    schedule 14.09.2012
comment
Вот это: Информация: ‹Talk: 0x6e66920› (сущность: Talk; id: 0x6e66880 ‹x-coredata://4063FE84-E6DB-4588-8133-9A55B512D6C8/Talk/p2›; данные: {date = 2012-08- 31 03:00:00 +0000; id = 7; говорящий = ‹ошибка связи: 0x6e994e0 'динамик'›; start_time = 17:14:55; })   -  person hdoria    schedule 14.09.2012
comment
Так это отношения один к одному?   -  person mkral    schedule 14.09.2012


Ответы (1)


Сначала проверьте объекты с помощью браузера SQLite (здесь, если у вас его нет). И убедитесь, что данные хранятся в основных данных. Получите доступ к файлу симулятора по адресу ~/Library/Application\ Support/iPhone\ Simulator/XX/Applications/XXXXXXXXXXX/Documents/XXXX.sqlite. Убедитесь, что в ZTALKS таблице есть столбец ZSPEAKER и значение для него, оно должно соответствовать значению Z_PK в ZSPEAKER таблице. Если это так, отношения связаны.

Ваша модель должна выглядеть примерно так:

введите здесь описание изображения

Когда у вас есть объект Talk, например:

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

Вы должны быть в состоянии схватить его динамик следующим образом:

Speaker *speaker = talk.speaker;

Я понимаю, что это немного отличается от вашей настройки, но, надеюсь, это должно помочь.

person mkral    schedule 14.09.2012
comment
На ZTALKS нет колонки ZSPEAKER. Этот столбец создается, когда я не устанавливаю отношения «многие ко многим». Когда я устанавливаю, столбец не создается. Вся информация поступает из JSON в следующем формате: дата: 2012-11-02, идентификатор: 8, имя: Java, динамик: [ /api/v1/speaker/1/, /api/v1/speaker/2/ ], Как сохранить массив: if ([значение isKindOfClass:[класс NSArray]]) { NSSet *valueSet = [NSSet setWithArray:value]; [managedObject setValue:valueSet forKey:key]; } - person hdoria; 16.09.2012