2010-09-27 73 views
6

我知道核心數據不是一個數據庫,有很多不同之處。這是嗎?核心數據:3表連接?

在數據庫中,我會經常有以下

A - >> B - >> C

「A」 具有其中有許多 「C」

的許多 「B」查詢,「給我全A已c.attr =‘X’是很容易寫的:

select * from a, b, c where a.id = b.aid and b.id = c.bid and c.attr = 'X' 

在覈心數據,我想這樣做,但使用謂詞,如:

NSPredicate *predicate = 
    [NSPredicate predicateWithFormat:@"ANY bs.cs.attr = %@", "X"]; 
[frequest setEntity:entityA]; 
[frequest setPredicate:predicate]; 

這樣做將導致錯誤: 「NSInvalidArgumentException」的,理由是:「多到多按鍵這裏不允許」

我是正確解釋的意思有什麼數據庫調用多的限制表連接?

我搜索了一遍,找不到明確的答案。

我目前的解決方案,這個查詢看起來像:

NSPredicate *predicate = 
    [NSPredicate predicateWithFormat:@"ANY cs.attr = %@", "X"]; 
... 
NSArray *bs = //execute fetch 
for (B *b in bs) { 
    //add b.a into an array 
} 
//return array 

有沒有更好的辦法?預先感謝您的考慮。

+0

呃,a,b,c連接語法是邪惡的。 – 2012-10-25 17:47:56

回答

8

你回頭看這個。

首先,您不需要核心數據中的鏈接ID,因爲所有相關對象都已通過關係鏈接。這意味着像where a.id = b.aid and b.id = c.bid這樣的結構完全不需要。

其次,您通常爲接收定義測試的實體設置獲取實體。在這種情況下,即c.attr="X"所以,您將獲取實體設置爲C和您的謂語應該是這個樣子:

NSPredicate *p=[NSPredicate predicateWithFormat:@"attr=%@",xValue]; 

這將返回數組中的所有C情況下滿足試驗。然後找到任何特定的BA只是步行關係爲每個C的問題。

如果你的反比關係是一對一如A < - >> B < - >> C時,你只要求每個Cb.a這樣的值:

AObject *anA = aCinstance.b.a; 

重要的是要記住你在這裏沒有處理表格。你正在處理一個對象圖。您將提取設置爲特定實體,然後遍歷過濾實體的關係。

+0

這有幫助。謝謝! – Mike 2010-09-28 04:27:16

1

核心數據是否可以爲b和a的屬性添加測試?或者我將不得不迭代遍歷每個結果集以獲得最終結果?

select 
    p.id, p.total 
from 
    purcord p, line l, delivery d 
where 
    l.purcord_id = p.id 
    and d.purcord_id = l.purcord_id 
    and d.purcord_line_no = l.line_no 
    and d.status = 'notdelivered' 
    and l.status = 'open' 
    and p.status = 'open'