2014-09-24 55 views
2

我有一個元素非常大的CoreData表像這樣(簡化):篩選功能實體描述

@interface Medicament : NSManagedObject 
@property (nonatomic, retain) NSString * identifier; 
@property (nonatomic, retain) NSString * name; 
@end 

在某些時候,我想找到的元素具有相同的性質(而丟棄其他),像這樣的SQLite一句話:

SELECT name, COUNT(*) AS count FROM Medicament GROUP BY name WHERE count > 1 

爲此,我有這樣的CoreData查詢:

NSFetchRequest* fetch = [NSFetchRequest fetchRequestWithEntityName:@"Medicament"]; 
NSEntityDescription* entity = [NSEntityDescription entityForName:@"Medicament" 
              inManagedObjectContext:self.managedObjectContext]; 
NSAttributeDescription* identifierDesc = [entity.attributesByName objectForKey:@"identifier"]; 
NSExpression *keyPathExpression = [NSExpression expressionForKeyPath: @"identifier"]; 
NSExpression *countExpression = [NSExpression expressionForFunction: @"count:" 
                  arguments: [NSArray arrayWithObject:keyPathExpression]]; 
NSExpressionDescription *expressionDescription = [[NSExpressionDescription alloc] init]; 
[expressionDescription setName: @"count"]; 
[expressionDescription setExpression: countExpression]; 
[expressionDescription setExpressionResultType: NSInteger32AttributeType]; 


[fetch setPropertiesToFetch:[NSArray arrayWithObjects:identifierDesc, expressionDescription, nil]]; 
[fetch setPropertiesToGroupBy:[NSArray arrayWithObject:identifierDesc]]; 
[fetch setResultType:NSDictionaryResultType]; 
NSError* error = nil; 
NSArray *results = [self.managedObjectContext executeFetchRequest:fetch 
                 error:&error]; 

這似乎正確返回字典列表,格式如下:

{ 
    count = 1; 
    identifier = 65023; 
}, 
    { 
    count = 2; 
    identifier = 65025; 
}, 
{ 
    count = 1; 
    identifier = 65027; 
} 

的問題是,我要放棄所有等於count1結果。

我已經嘗試添加一個謂詞來抓取希望CoreData是這樣的聰明:

NSPredicate* predicate = [NSPredicate predicateWithFormat:@"count > 1"]; 
fetch.predicate = predicate; 

但它與錯誤keypath count not found in entity <NSSQLEntity Medicament id=11>崩潰。

這甚至可能使用CoreData或從數據庫中提取後是否必須過濾結果?


這是我目前用於過濾對象的方法從數據庫中已經加載:

NSPredicate* filterPredicate = [NSPredicate predicateWithFormat:@"count > 1"]; 
NSArray* filteredResults = [results filteredArrayUsingPredicate:filterPredicate]; 

,但我希望這個簡單的計算可​​以通過CoreData或SQLite的執行,這可能會更高效。

+0

您在這裏做的是將謂詞設置爲實體設置爲藥劑的提取請求,因此藥劑沒有名爲count的屬性!您可以創建一個具有標識符和count屬性的模型,並使用從coredata獲得的結果填充它,然後使用此謂詞過濾該模型的數組。所以是的,我認爲你必須首先從coredata獲取結果,然後過濾它們。 – 2014-09-24 17:24:08

+0

@NofelMahmood是的,那是一個無望的嘗試。我猜數據庫引擎會比我通過代碼執行操作要快得多。目前數據庫有30k行,大約28k將被丟棄。所以我會從數據庫加載大量不需要的數據。 – redent84 2014-09-24 17:28:15

+0

您是否使用過NSFetchRequest的「havingPredicate」功能? – pbasdf 2014-09-24 17:29:22

回答

0

您可以做到這一點的唯一方法是首先獲取數據,然後從那裏通過計數進行過濾。

如果您希望可以向稱爲count的實體添加一個屬性,然後您可以使用該謂詞來篩選所需實體(在此情況下計數> 1),但是您需要在藥劑中添加計數屬性實體做到這一點。

+0

正如你在最後幾行看到的那樣,這就是我正在做的事情 – redent84 2014-09-25 11:01:00