我的核心数据存在问题,这让我陷入了困境。所以我想知道你们中的任何一个人是否能提供帮助。
基本上,我在Core Data项目中有两个实体。这些是:
作者{authorName,dateOfBirth}
预订{bookName,pages}
从作者到被称为“作者”的书籍之间存在一对多的关系,以及称为“书籍”的反向关系。我已经导出了这些实体的子类,并创建了我的fetch控制器。我现在必须以编程方式定义关系吗?
作者列表当前显示在我的表格视图中。目前,当我点击作者时,我只能在我的核心数据项目中显示所有书籍的列表。我如何访问特定作者的书籍列表?我假设我会使用NSPredicate,到目前为止,我的逻辑是:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY authors.bookName LIKE[cd] %@", authorName];
......但我很确定这是不正确的。
我一直在网上爬几个小时寻找答案并且仍然感到困惑。所以任何帮助都将不胜感激。
非常感谢:)
答案 0 :(得分:0)
成员变量“books”存在于Author类中,并指向NSManagedObject记录的NSSet,所有这些记录都是Book对象。
显然你可以获得一个作者对象,所以在给定作者对象的情况下获取该作者的书籍列表:
NSManagedObject *author = [self getSelectedAuthor];
NSSet *booksByAuthor = [author valueForKey:@"books"];
NSArray *booksArray = [booksByAuthor allObjects];
然后,您可以使用NSArray填充UITableView。
XCode能够为您的Core Data实体自动创建托管对象类。打开你的xcdatamodel文件,选择一个实体,然后选择File - >新。您应该看到托管对象类作为选项。这将允许您创建Author和Book类作为NSManagedObject的子类。这些类将实体的每个属性定义为属性,这意味着上面的代码可以是:
Author *author = [self getSelectedAuthor];
NSSet *booksByAuthor = author.books;
NSArray *booksArray = [booksByAuthor allObjects];
答案 1 :(得分:0)
您可能会遇到以下情况:
@interface AuthorListController : UITableViewController {
UITableView *table;
NSArray *authors; // array of NSManagedObjects
}
@property (nonatomic, retain) IBOutlet UITableView *table;
@property (nonatomic, retain) NSArray *authors;
在您的实施中,您有:
-(void)tableView:(UITableView*)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath {
NSManagedObject *author = [authors objectAtIndex:indexPath.row];
// create and show your book-level view here
}
现在您已经拥有了所选的作者对象,您可以直接获取书籍(假设您已在Data Modeler中设置了一对多关系):
NSSet *books = author.books;
但是如果您没有加载作者对象,无论出于何种原因,您可以构建新的搜索并在谓词中使用books-> authors关系:
NSManagedObjectContext *objectContext = self.managedObjectContext;
NSEntityDescription *entity = [NSEntity entityForName:@"Books" inManagedObjectContext:objectContext];
NSFetchRequest *fetch = [[NSFetchRequest alloc] init];
[fetch setEntity:entity];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"author.name == %@", authorName];
[fetch setPredicate:predicate];
// ... create your error object and execute the fetch, etc