Iphone 核心数据-设置关系

Iphone 核心数据-设置关系,iphone,core-data,predicate,relationship,Iphone,Core Data,Predicate,Relationship,我的核心数据有问题,这让我束手无策。所以我想知道你们这些优秀的人是否能帮上忙 基本上,我在一个核心数据项目中有两个实体。这些是: 作者{authorName,出生日期} 书籍{bookName,pages} 作者与书籍之间存在一对多的关系,称为“作者”,反之称为“书籍”。我已经导出了这些实体的子类,并创建了fetch控制器。我现在是否必须以编程方式定义关系 作者列表当前显示在“我的表”视图中。目前,当我点击作者时,我只能显示核心数据项目中所有书籍的列表。我如何访问特定作者的书籍列表?我假设我会使

我的核心数据有问题,这让我束手无策。所以我想知道你们这些优秀的人是否能帮上忙

基本上,我在一个核心数据项目中有两个实体。这些是:

作者{authorName,出生日期}
书籍{bookName,pages}

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

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

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY authors.bookName LIKE[cd] %@", authorName];
。。。但我很肯定这是不正确的

我已经在网上搜寻了几个小时的答案,但仍然很困惑。因此,任何帮助都将不胜感激

非常感谢:)

成员变量“books”存在于Author类中,并指向一组NSManagedObject记录,所有这些记录都将是Book对象

显然,您可以获得一个author对象,因此要获得给定author对象的作者的书籍列表:

NSManagedObject *author = [self getSelectedAuthor];
NSSet *booksByAuthor = [author valueForKey:@"books"];
NSArray *booksArray = [booksByAuthor allObjects]; 
然后可以使用NSArray填充UITableView

XCode能够自动为核心数据实体创建托管对象类。打开xcdatamodel文件,选择其中一个实体,然后选择file->New。您应该将托管对象类视为一个选项。这将允许您创建Author和Book类作为NSManagedObject的子类。这些类将实体的每个属性定义为属性,这意味着上面的代码可以读取:

Author *author = [self getSelectedAuthor];
NSSet *booksByAuthor = author.books;
NSArray *booksArray = [booksByAuthor allObjects];

您可能有以下情况:

@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
}
现在您已经获得了选定的author对象,您可以直接获得书籍(假设您已经在Data Modeler中设置了一对多关系):

NSSet *books = author.books;
但是,如果您没有加载author对象,无论出于何种原因,您都可以构建一个新的搜索,并在谓词中使用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

很抱歉,我不知道这对我有什么帮助。我是在“详细视图控制器”还是“视图控制器”中执行此操作?另外,“getSelecterAuthor”从何而来?无论我尝试什么,使用您编写的内容都会使我的应用程序崩溃。这将出现在author表视图代理的表视图中:DidSelectRowatineXpath:。在本例中,getSelectedAuthor是一个伪代码抽象,用于获取用户选择的author对象。您已经在某个地方有了Author对象,否则您将无法填充Author UITableView。booksArray应该交给您的detail表视图。谢谢您的回复。我已经接受了您所说的内容,但当我记录传递的booksArray时,它似乎是空的“booksArray:()”我的tableView中有以下代码:didSelectRowAtIndexPath NSManagedObject*selectedObject=[[self-fetchedResultsController]objectAtIndexPath:indexath];作者*作者=所选对象;NSSet*booksByAuthor=author.books;NSArray*booksArray=[booksByAuthor allObjects];myDetailViewController.booksArray=booksArray;但是就像我说的,传递的数组是空的?我没有“authors”的NSArray?我只是使用默认的导航控制器核心数据模板。还有,“author.name”是指“author.authorName”吗?我没有简单的“.name”。谢谢。我现在设法解决了这个问题。我使用了“authorName=%@”,authorName。谢谢你的帮助!