2010-04-16 50 views
9

我有一個基於核心數據的應用程序來管理一堆實體。我期望能夠做到以下幾點。使用核心數據檢索唯一結果集

我有一個實體「SomeEntity」的屬性:name,type,rank,foo1,foo2。

現在,如果我們嚴格按照SQL術語說話,SomeEntity有幾行。我試圖完成的是隻檢索可用的類型,即使每個實例可以有重複的類型。我也需要他們按照等級順序歸還。因此,在SQL,我正在尋找的是以下幾點:

SELECT DISTINCT(type) ORDER BY rank ASC

這是我迄今多數民衆贊成打破代碼:與下面的崩潰

NSError *error = NULL; 
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
[fetchRequest setReturnsDistinctResults:YES]; 
[fetchRequest setPropertiesToFetch:[NSArray arrayWithObjects:@"type", @"rank", nil]]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"SomeEntity" inManagedObjectContext:managedObjectContext]; 
[fetchRequest setEntity:entity]; 

// sort by rank 
NSSortDescriptor *rankDescriptor = [[NSSortDescriptor alloc] initWithKey:@"rank" ascending:YES]; 
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:rankDescriptor,nil]; 
[fetchRequest setSortDescriptors:sortDescriptors]; 
[sortDescriptors release]; 
[rankDescriptor release]; 

NSArray *fetchResults = [managedObjectContext executeFetchRequest:fetchRequest error:&error]; 

[fetchRequest release]; 

return fetchResults; 

現在: Invalid keypath section passed to setPropertiesToFetch:

+0

更新的例子。 屬性有錯誤提取 – 2010-04-16 22:07:28

+0

如果您要指定屬性來獲取@「type」和@「rank」,那麼您將在兩個屬性中獲得不同的屬性。 您應該只指定@「type」屬性 – 2010-04-16 22:08:54

回答

18
NSManagedObjectContext * ctx ; /* some ctx */  
NSFetchRequest * req; /* your request */ 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"SomeEntity" inManagedObjectContext:context]; 
NSDictionary *entityProperties = [entity propertiesByName]; 
[req setEntity:entity]; 
[req setReturnsDistinctResults:YES]; 
[req setPropertiesToFetch:[NSArray arrayWithObject:[entityProperties objectForKey:@"type"]]]; 
[req setSortDescriptors:[NSArray arrayWithObject:[[NSSortDescriptor alloc] initWithKey:@"rank" ascending:YES]]]; 
NSArray * result = [ctx executeFetchRequest:req error:nil]; 
+0

編輯示例以ged ORDER BY。 因此,您將收到Array of'SomeEntity',不同類型,按排名排序 – 2010-04-16 21:50:24

+0

小修正。 編輯屬性獲取。 – 2010-04-16 22:06:33

+3

[fetchRequest setResultType:NSDictionaryResultType]; 設置它,你將不會收到SomeEntity'ies的結果,但在你的情況下只有一個獲取的屬性@「type」的NSDictionary – 2010-04-16 22:22:49