2010-08-01 44 views
0

我有一个核心数据问题,它让我在我的系绳末尾。所以我想知道你们中的任何一个人都可以提供什么帮助。核心数据 - 设置关系

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

作者{AUTHORNAME,出生日期}
书{BOOKNAME,页}

有一个从笔者一个一对多的关系,书被称为“作家”,而相反的关系称为“书”。我导出了这些实体的子类,并创建了我的获取控制器。我现在必须以编程方式定义关系吗?

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

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

...但我敢肯定,不正确。

我一直在爬网几个小时的答案,并保持困惑。所以任何帮助将不胜感激。

非常感谢:)

回答

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; 

但是,如果你没有装author对象,不管什么原因,你可能在你的断言建立一个新的搜索和使用的书籍 - >作者的关系:

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

我没有'作者'的NSArray?我只是使用默认的导航控制器核心数据模板。 另外,'author.name'的意思是'author.authorName'?我没有一个简单的'.name'。 谢谢。 – Martyn 2010-08-02 12:33:22

+0

我现在设法解决了这个问题。 我用'authorName ==%@“,authorName'。谢谢你的帮助! – Martyn 2010-08-03 13:04:00

0

成员变量“书”存在于你的Author类,并指出NSManagedObject的NSSet中的记录,所有这些都将是书的对象。

显然你能得到一个作家的对象,所以给出笔者对象,笔者拿到的书籍列表:

NSManagedObject *author = [self getSelectedAuthor]; 
NSSet *booksByAuthor = [author valueForKey:@"books"]; 
NSArray *booksArray = [booksByAuthor allObjects]; 

然后,您可以使用NSArray的填充一个UITableView。

XCode能够为您的核心数据实体自动创建托管对象类。打开你的xcdatamodel文件,选择一个实体,然后选择文件 - >新建。您应该看到托管对象类作为选项。这将允许您创建作为NSManagedObject的子类的作者和书籍类。这几类定义为一个属性,这意味着该代码的实体的每个属性上面可能写着:

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

我对不起,但我不知道这对我有什么帮助。 – Martyn 2010-08-01 21:20:46

+0

这有帮助吗? – 2010-08-01 22:51:06

+0

我是否在我的详细视图控制器或我的视图控制器中执行此操作?另外,'getSelecterAuthor'从哪里来? – Martyn 2010-08-02 12:03:59