2011-11-23 21 views
0

在一個數據庫中我有以下情況,A有很多B's和C也有很多B的。 使用核心數據關係來搜索此類查詢的有效方式是什麼?核心數據:三個或更多的表連接

  1. 我需要在兩個a.xc.y搜索屬性
  2. 然後我需要那些B的哪些是共同的

例如:

records are separated by colon (";"), and attributes by comma (",")

A = {a;b} 
C = {m;n} 
B = {1,a,m;2,a,n;3,a,n;4,b,m;5,b,m;6,a,m;7,b,n;8,b,n} 

請問查詢c.x = ma.y = a導致B = {1;6}以下記錄?

回答

4

技術說明:核心數據不是關係型數據庫,所以並沒有真正的「連接」。它更準確地描述爲對象圖。

這應該是很容易實現你想要什麼:

設置了實體ABC的典範。

BA一個「一對多」的關係(此屬性稱爲a),以及「一對多」到C關係(此屬性稱爲c)。

根據需要用數據填充此模型。

然後讓你的 '加入',搜索使用謂詞如下:

NSFetchRequest* fetchRequest = [[NSFetchRequest alloc] init]; 

NSEntityDescription *entity = [NSEntityDescription entityForName:@"B" inManagedObjectContext:del.managedObjectContext]; 
[fetchRequest setEntity:entity]; 

NSString* predicateString = [NSString stringWithFormat:@"a.x = %@ AND b.y = %@", 
         @"something1", @"something2"]; 

fetchRequest.predicate = [NSPredicate predicateWithFormat:predicateString]; 

NSError *error = nil; 
NSArray* objects = [del.managedObjectContext executeFetchRequest:fetchRequest error:&error]; 

iPhone CoreData join見。

+0

謝謝,它的功能就像一個魅力。我認爲應該有一個適當的指導,幫助像我這樣的人從數據庫轉移到核心數據,就像核心數據中的所有關於對象的東西一樣,而我的問題是我一直在考慮連接。如果你知道任何有關它的好資源,請讓我知道 – cocoaNoob

+1

CocoaNoob,這篇文章是一個相當不錯的比較:http://cocoawithlove.com/2010/02/differences-between-core-data-and.html 也谷歌的東西,如「核心數據與關係數據庫」。 請你考慮接受我的答案,如果你發現它是最好的,請嗎? – occulus

1

我不知道我理解你的問題,但至少我可以回答如何讓兩個核心數據管理對象共同具有一定特性的對象。

你有兩個核心數據實體,AC。作爲所有核心數據實體,它們在運行時由NSManagedObject實例表示。您已經定義AC每有一個叫做B關係,這是一個一對多或多對多許多。換句話說,每個A對象可以有多個B對象,因此可以有C

爲了使這更容易一點,我會想出其他的名字這些類:

Dessert <<---->> Ingredient 
MainDish <<---->> Ingredient 

假設的關係被稱爲ingredients。然後,您可以得到一個甜點的所有成分與

NSSet* dessertIngredients = [myDessert valueForKey:@"ingredients"]; 

而且也得到了成分的主菜像這樣:

NSSet* mainDishIngredients = [myMainDish valueForKey:@"ingredients"]; 

爲了得到這兩個集合的交集,您需要使用可變集對象:

NSMutableSet* commonIngredients = [NSMutableSet setWithSet:dessertIngredients]; 
[commonIngredients intersectSet:mainDishIngredients]; 

另一種方式來獲得相同的結果是利用可可的KVC collection operator@distinctUnionOfArrays

NSArray* objectsWithIngredients = [NSArray arrayWithObjects:myMainDish, myDessert, anotherMainDish, nil]; 
NSSet* uniqueIngredients = [anotherMainDish valueForKeyPath:@"@distinctUnionOfArrays.ingredients"]; 
+0

爲什麼不使用包含'AND'的謂詞讓Core Data完成繁重的工作?那麼就沒有必要亂交集合交集。 – occulus

+0

你是對的。我只是部分地理解了這個問題,並沒有考慮使用反向關係,這顯然更好。 – Felixyz

+0

嘿謝謝你的回覆,你的方法也很好,而且容易理解,但是我認爲用核心數據進行謂詞搜索會更有效率。 – cocoaNoob