2010-08-01 60 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