IOS/Core 数据:如何通过关系从其他实体获取属性

IOS/Core Data: How to fetch attribute from other entity through relationship

我有一个包含核心数据的主细节控制器,它从一个实体(即作者)获取对象,然后让您详细查看其中一个对象,即一位作者。

作者对象与第二个实体 Books 具有一对多关系。对于每位作者,我想显示他们的书籍的可点击列表。

我的第一个问题是在显示作者页面后,如何获取图书列表。

最终,我想在标签或按钮中将列表显示为可点击的文本,也许使用 NSAttributed Text,但现在我很乐意只检索图书列表。

作者与名为 book 的书籍之间存在一对多关系,书籍与作者之间存在互惠关系,名为 author,也就是一对一。

我将 books.h(数据文件)导入 authorsVC.h 和 authorsDetail.h 控制器。

authors.h文件有一个属性如下:

@property (nonatomic, strong) Books *authorBook;

下面的代码没有抛出异常而是注销null。

 NSLog(@"books %@", _authorBook.bookname); //logs as null even when there are books for the author.

此代码抛出显示的异常:

NSLog(@"books %@", _author.book.bookname);

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[_NSFaultingMutableSet bookname]: unrecognized selector sent to instance

Core Data 中的对多关系被实现为 NSSet 个实例。在您的情况下,因为 Author -> Book 是一对多关系,_author.bookBook 个实例的 NSSet——这是书籍的集合. Book 可能有一个名为 bookName 的属性,但 NSSet 没有。

如果您只想要书名,可以使用

_author.book.valueForKey[@"bookName"]

这将向集合中的每个 Book 询问其 bookName 和 return 一组新的书名。

下面的代码成功了。类似于 Tom's,鉴于我的评级,我不允许投票,但有一些调整,因为它不接受点符号。 valueForKey 用于数组。

NSSet *books = _book.author;
   NSArray *booksarr = [[files valueForKey:@"author"] allObjects];
   NSString *bookstr = [booksarr componentsJoinedByString:@","];

在一个字符串中,您可以根据需要显示它。