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

有几本书和几个人(创作者)。创作者可以是作者、译者、插画家(.)。有些“创造者”有几个“角色”,这就是为什么我最终选择了"CreatorBook-Entity",因为有时同一个创作者对不同的书有不同的角色。
不管怎样..。在这个应用程序中,我展示了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?(上面的代码在第一步就停止了)
是否可以从Creator中获取由属性排序的所有Books (例如,作者全名(多个作者->展示书籍多次))?
发布于 2013-09-05 10:51:40
首先,Book的属性名creator具有误导性。一本书可能有一个以上的创作者,即作者、插画家等,所以我用creators (复数)来反映多方面的关系。类似地,我将to -多关系从Creator重命名为join表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只是一个作者,则可以省略第二个谓词。
https://stackoverflow.com/questions/18632051
复制相似问题