2013-09-05 2 views
0

Только начиная с CoreData и просто интересно, как создать «сложный» FetchRequest. Я следующие структуры данных (уменьшенные на вопрос):Объектив C Основные данные: выборка из нескольких объектов

enter image description here

Есть несколько книг и несколько людей (МКО). Создатели могут быть автором, переводчиком, иллюстратором (...). У некоторых «Создателей» есть несколько «ролей», поэтому я оказался в «CreatorBook-Entity», потому что иногда один и тот же создатель имеет разные роли для разных книг.

В любом случае ... В приложении I показать Book и есть CollectionView с другим Books от того же автора (= Creator с role= Author). Я пытался создать FetchRequest, но не знал, как объединить различные сущности, поэтому на данный момент я перебирать CoreData как следующее:

//Get all Creators from Book and get the first Author 
Creator* author; 
NSSet* creatorSet = self.book.creator; 
if([creatorSet count] > 0){ 
    for(CreatorBook *uObjects in creatorSet){ 
     if([uObjects.role isEqualToString:@"Author"]){ 
      author = uObjects.creator; 
      break; //get first author 
     } 
    } 
} 

//Get all the Book from the same Author 
if(author != nil){ 

    NSSet* authorBooks = author.book; 

    NSMutableArray* books = [[NSMutableArray alloc] init]; 
    for(CreatorBook* object in authorBooks){ 
     Book* a = object.book; 

     [books addObject:a]; 

    } 
    _authorBookCollection = books; 

    [self.bookPreview reloadData]; 
} 

Есть ли способ, чтобы получить тот же результат с одним FetchRequest?

Как я могу получить все Books, если их более одного Author? (мой код выше останавливается при первом)

Можно ли получить все Books, упорядоченные по атрибуту от Создателя (например, авторы fullname (более одного автора -> показ книги несколько раз))?

ответ

0

Во-первых, ваше имя атрибута creator для объекта книги вводит в заблуждение. Потенциально, книга имеет более одного создателя, т. Е. Автора, иллюстратора и т. Д. Поэтому я использовал creators (во множественном числе), чтобы отразить отношения «многие». Точно так же я переименовал отношения ко многим из Творца в таблицу соединений books.

Во-вторых, я предполагаю, что в книге есть только один автор - или один создатель с той же ролью. Конечно, можно подумать, что это может быть другим (есть решение для этого случая).

NSSet *creatorsOfThisBook = book.creators; 
Creator *authorOfThisBook = [[creatorsOfThisBook filteredSetUsingPredicate: 
    [NSPredicate predicateWithFormat:@"role = %", @"author"]] anyObject]; 
NSSet *booksByThisAuthor = [[authorOfThisBook.books filteredSetUsingPredicate: 
    [NSPredicate predicateWithFormat:@"role = %", @"author"]] 
    valueForKeyPath:@"book"]; 

Вы можете видеть, что если Творец является только автором, вы можете оставить второй предикат.

Смежные вопросы