2016-02-19 93 views
0

我有一个核心数据的主控细节控制器,用于从一个实体(即作者)中获取对象,然后让您详细查看其中一个对象,一位作者。IOS /核心数据:如何通过关系从其他实体获取属性

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

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

最后,我想将标签或按钮中的列表显示为可点击的文本,可能使用NSAttributed Text,但现在只需检索书籍列表即可。

作者有书本的关系,题为,这是一对多和书籍有作者的相互关系,有权作者,这是一一对应的。

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

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

@property (nonatomic, strong) Books *authorBook; 

下面的代码不会抛出异常,但注销空。

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 
+0

您是否在创建实体时保存上下文之前设置了关系? –

+0

Core Data中一对多关系的** many **方面总是由一个'NSSet'对象表示。这也在异常错误消息中指出。 – vadian

+0

我在哪里使用NSSet? bookname只是书本实体中的属性名称。 – zztop

回答

0

下面的代码做到了。类似汤姆的,我不允许我给予评价,但只作了一些调整,因为它不接受点符号。 valueForKey用于数组。

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

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

0

一对多在核心数据关系被实现为NSSet实例。在你的情况下,因为Author - >Book是一对多的关系,_author.bookBook实例的NSSet--这是书籍的集合。 Book可能有一个称为bookName的属性,但NSSet没有。

如果你只是想这本书的名字,你会使用

_author.book.valueForKey[@"bookName"] 

,询问组中的每个BookbookName并返回一个新的集只是这本书的名字。

+0

我得到错误“Property'valueForKey'not found on type of Books *” – zztop

+0

不知道为什么我不能使用valueForKey .... – zztop

+0

这是否在for循环?试过NSSet * books = _author.book; NSSet * bookNames = [books valueForKey:@“bookName”]; for(NSManagedObject * bookName in bookNames){ NSLog(@“book name is:%@”,bookName); };但是,变量bookNames是空的,for循环不执行。书本实体中肯定有书名。 – zztop