我有一個元素非常大的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;
}
的問題是,我要放棄所有等於count
到1
結果。
我已經嘗試添加一個謂詞來抓取希望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的執行,這可能會更高效。
您在這裏做的是將謂詞設置爲實體設置爲藥劑的提取請求,因此藥劑沒有名爲count的屬性!您可以創建一個具有標識符和count屬性的模型,並使用從coredata獲得的結果填充它,然後使用此謂詞過濾該模型的數組。所以是的,我認爲你必須首先從coredata獲取結果,然後過濾它們。 – 2014-09-24 17:24:08
@NofelMahmood是的,那是一個無望的嘗試。我猜數據庫引擎會比我通過代碼執行操作要快得多。目前數據庫有30k行,大約28k將被丟棄。所以我會從數據庫加載大量不需要的數據。 – redent84 2014-09-24 17:28:15
您是否使用過NSFetchRequest的「havingPredicate」功能? – pbasdf 2014-09-24 17:29:22