2013-04-23 86 views
0

我已經創建了一個測試項目,學習如何使用Core Data。我所做的是,創建兩個實體:許多核心數據查詢只顯示1條記錄

  • 客戶
      • 關係 - >項目(一對多的關係)
  • 項目
    • 項目
      • 關係 - >客戶

我已創建2 UITableViewControllers一個顯示所有客戶端和一個將顯示與該客戶的所有項目。

爲了證明我創造了這個方法,所有相關的項目:

-(NSArray *)relatedProjects:(Client *)client; 
{ 
    NSFetchRequest *request = [[NSFetchRequest alloc]init]; 

    NSEntityDescription *e = [[model entitiesByName] objectForKey:@"Project"]; 

    [request setEntity:e]; 

    [request setPredicate:[NSPredicate predicateWithFormat:@"SELF IN %@", client.projects]]; 



    NSSortDescriptor *sd = [NSSortDescriptor sortDescriptorWithKey:@"project" 
                 ascending:YES]; 
    [request setSortDescriptors:[NSArray arrayWithObject:sd]]; 

    NSError *error; 
    NSArray *result = [context executeFetchRequest:request error:&error]; 


    if (!result) { 
     [NSException raise:@"Fetch failed" 
        format:@"Reason: %@", [error localizedDescription]]; 
    } 
    relatedProjects = [[NSMutableArray alloc] initWithArray:result]; 

//return result; 
return relatedProjects; 

}

唯一的問題是,是將只顯示1個項目,而不是所有的相關項目。 如果我忽略這一行,則會顯示所有項目,但是項目和客戶之間沒有關係。

[request setPredicate:[NSPredicate predicateWithFormat:@"SELF IN %@", client.projects]]; 

(我的測試用例,我創建1個客戶端的幾個項目,所以我知道它應該表現出更多的則1個項目)

所以我堅持如何解決這個問題,因爲有幾個可能性,這是爲什麼不工作:

  1. 謂詞不是客戶和項目之間確定
  2. 關係也不行

所以,如果有任何人誰可以給我一些指點,那將是巨大的。

+0

你設定的反比關係?爲什麼不只是返回'[client.projects allObjects]'? – 2013-04-23 18:31:06

+0

[client.projects allObjects]給出完全相同的輸出,所以只返回1條記錄。我如何設置反比關係?我認爲這是自動設置的? – Eloy 2013-04-23 18:34:34

+0

如果你的意思是在檢查員中設置inversie關係,那麼我已經完成了。 – Eloy 2013-04-23 18:36:37

回答

0

在假設:
你有很多一對多的客戶< <關係 - >>項目(你應該標記都projectsclients的關係,一對多在編輯器中)。
您已經正確設置了反轉關係(在模型編輯器中)。
您正在將這些對象正確添加到關係中。

嘗試改變謂詞:
[NSPredicate predicateWithFormat:@"%@ IN clients",client.objectID]

+0

謝謝。這是一對多的關係,一個客戶可以有更多的項目,但一個項目只能有一個客戶。在Client.h文件中可以看到NSSet *項目,而在project.h中可以看到Client *客戶端。如果我嘗試使用謂詞,程序會出錯。核心數據對我來說是新的,理解爲什麼。 – Eloy 2013-04-23 19:22:40

+0

我沒有測試過這個謂詞。我會測試它並回復你。 – 2013-04-23 19:26:24

+0

我已經測試了這個謂詞,它對於一對多的關係似乎工作正常。你所描述的是你的關係沒有被定義爲多對多的,所以你正在尋找客戶端是你選擇的客戶端的項目==>將客戶端更改爲客戶端,並將謂詞更改爲[NSPredicate predicateWithFormat :@「client ==%@,client.objectID]' – 2013-04-23 19:49:24

0

我希望創建克林特模型像

客戶端 -

# clientId 

# clientName 

# createProjects //relation to project 

項目

# projectId 

# project 

# createdBy // relation inverse to createProjects 

當你獲取數據第一次提取客戶數據和數據加載的tableView。一旦特定的客戶端選擇獲取projectDetails(使用關係)並加載tableView。

客戶端。createdProjects會爲您提供一組Project對象。

+0

除了添加ID的屬性,在我眼中,它看起來和你描述的一樣。你知道是否有一種簡單的方法來檢查實體是否存儲了正確的關係?如果我將NSLOG與%@結合使用,那麼只需爲「0x83b9da0 」 – Eloy 2013-04-23 18:40:55

+0

這些關係打印出類似於NSEntityDescription類型的對象將這些內容轉換爲客戶端或項目然後打印。 – AMohan 2013-04-23 18:47:29

0

你正在做很多工作。如果您已經在模型中建立了關係,客戶端已經有相關項目的列表。它將被命名爲與關係相同。 當您獲取客戶端對象,項目清單將是一個「錯誤」,但只要你訪問它

NSArray* allProjects = client.projects; 

核心數據會發現,它不填充尚未與去取列表爲你。

快速摘要:

-(NSArray *)relatedProjects:(Client *)client; 
{ 
    return client.projects; 
} 

完成。

這實際上是爲什麼你使用核心數據,而不是直接使用sql(在許多其他很酷的理由)。

+0

NSArray * allProjects = client.projects給我這個警告:「不兼容的指針類型返回'NSSet *'從結果類型爲'NSArray *'的函數'」那麼這是否意味着我的關係不正確? – Eloy 2013-04-23 18:51:23