核心数据 - 建立关系

时间:2010-08-01 20:42:46

标签: iphone core-data predicate relationship

我的核心数据存在问题,这让我陷入了困境。所以我想知道你们中的任何一个人是否能提供帮助。

基本上,我在Core Data项目中有两个实体。这些是:

作者{authorName,dateOfBirth}
预订{bookName,pages}

从作者到被称为“作者”的书籍之间存在一对多的关系,以及称为“书籍”的反向关系。我已经导出了这些实体的子类,并创建了我的fetch控制器。我现在必须以编程方式定义关系吗?

作者列表当前显示在我的表格视图中。目前,当我点击作者时,我只能在我的核心数据项目中显示所有书籍的列表。我如何访问特定作者的书籍列表?我假设我会使用NSPredicate,到目前为止,我的逻辑是:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY authors.bookName LIKE[cd] %@", authorName];

......但我很确定这是不正确的。

我一直在网上爬几个小时寻找答案并且仍然感到困惑。所以任何帮助都将不胜感激。

非常感谢:)

2 个答案:

答案 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