0

刚从 CoreData 开始,只是想知道如何创建“复杂” FetchRequest。我有以下数据结构(缩小问题):

在此处输入图像描述

有几本书和几个人(创作者)。创作者可以是作者、翻译者、插画家 (...)。一些“创作者”有几个“角色”,这就是我最终选择“CreatorBook-Entity”的原因,因为有时同一个创作者对不同的书有不同的角色..

无论如何......在应用程序中,我展示了Book一个 CollectionView 与Books来自同一作者的其他人(=Creatorrole= 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?(我上面的代码停在第一个)

是否可以从 Creator 中获取所有Books按属性排序的内容(例如作者全名(不止一位作者 -> 多次显示图书))?

4

1 回答 1

0

首先,您creator的 Book 实体的属性名称具有误导性。潜在地,一本书有不止一个创作者,即作者、插画家等。所以我用creators(复数形式)来反映一对多的关系。同样,我将多对多关系从 Creator 重命名为 join table 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"];

您可以看到,如果 Creator 只是一个作者,您可以省略第二个谓词。

于 2013-09-05T10:51:40.910 回答