2011-08-09 67 views
28

我試圖將我的NSFetchRequest設置爲核心數據以檢索實體中特定屬性的唯一值。即CoreData獲取不同的屬性值

具有以下信息的實體:

name | rate | factor | 
_______|______|________| 
John | 3.2 | 4 | 
Betty | 5.5 | 7 | 
Betty | 2.1 | 2 | 
Betty | 3.1 | 2 | 
Edward | 4.5 | 5 | 
John | 2.3 | 4 | 

我將如何建立與剛剛返回數組請求:約翰,貝蒂,愛德華?

回答

69

您應該使用後備存儲來幫助您獲得不同的記錄。

如果你想獲得一個數組只有約翰,貝蒂,愛德華這裏是你如何做到這一點:

NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"MyEntity"]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"MyEntity" inManagedObjectContext:self.managedObjectContext]; 

// Required! Unless you set the resultType to NSDictionaryResultType, distinct can't work. 
// All objects in the backing store are implicitly distinct, but two dictionaries can be duplicates. 
// Since you only want distinct names, only ask for the 'name' property. 
fetchRequest.resultType = NSDictionaryResultType; 
fetchRequest.propertiesToFetch = [NSArray arrayWithObject:[[entity propertiesByName] objectForKey:@"name"]]; 
fetchRequest.returnsDistinctResults = YES; 

// Now it should yield an NSArray of distinct values in dictionaries. 
NSArray *dictionaries = [self.managedObjectContext executeFetchRequest:fetchRequest error:nil]; 
NSLog (@"names: %@",dictionaries); 
+0

AlleyGator,但是如果我有多個具有相同屬性的對象(如示例中的多個Betty),並且我不'不想重複價值觀? –

+0

這會給你一個三個名字的數組,沒有重複。沒有其他數據。沒有速度,沒有因素。 – AlleyGator

+1

我錯過了returnsDistinctResults屬性。謝謝。 Upvoted的答案,但NSArray沒有'allValues'方法。所以我仍然需要做一個for循環來獲取數組中每個NSDictionary的每個值。 –

15

您正在嘗試像過程數據庫那樣使用Core Data,而不是API作爲對象圖管理器,所以您不會找到一個簡單的方法來執行此操作。

在Core Data中沒有一種簡單的方法可以做到這一點,因爲Core Data關注的是對象而不是值。由於託管對象保證是唯一的,因此核心數據並不十分關心每個對象的值或者它們是否重複或其他對象的值。

要找到獨特的價值觀:

  1. 執行fetch by specific value。這將爲您提供一個字典數組,其中包含一個鍵name和一個名稱字符串本身的值。
  2. 在(1)中的返回數組上使用set collection operator返回一組唯一值。

所以,像這樣:

NSSet *uniqueNames=[fetchedNameDicts valueForKeyPath:@"@distinctUnionOfSets.name"]; 

...這將返回一組的NSString的對象都具有獨特的價值。

+1

+1這就是我要說,但我會選擇'@」 distinctUnionOfObjects.name「'。我不相信有什麼區別。 – Caleb

+0

NSExpression和NSExpressionDescription會是什麼樣子? – ephilip

+0

@ephilip - 我會就此提出另一個問題。我無法將其納入評論。 – TechZen

5

看看Fetching Specific Property Values,沒有必要使用Set來獲取不同的值。

+0

我想檢索對象,不僅僅是那個列值。如果你有任何想法請幫助........ @Alexandre L Telles –