2016-02-28 4 views
0

Возможно ли это использовать агрегатные функции фильтра:Основные данные использовать агрегатную функцию в фильтре

var expressionDescriptions = [AnyObject]() 
let request = NSFetchRequest(entityName: "Item") 
let expressionDescription = NSExpressionDescription() 
expressionDescription.name = "requestsCount" 
expressionDescription.expression = NSExpression(format: "@sum.requests.id") 
expressionDescription.expressionResultType = .Integer32AttributeType 
expressionDescriptions.append(expressionDescription) 

request.predicate = NSPredicate(format: "requestsCount != sitesCount") 
request.propertiesToFetch = expressionDescriptions 
do { 
    let items = try self.managedObjectContext.executeFetchRequest(request) 
} catch { 
} 

Этот код возвращает мне ошибку:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'keypath requestsCount not found in entity

ответ

1

Есть несколько проблем с тем, как вы используя NSExpression и соответствующие API. Это сложно и, возможно, не нужно в вашем случае.

Предполагая, что эта структура данных:

Item (requests) <--->> NSSet? (Request) 
    (sitesCount) Int 

Вы должны просто извлечь все элементы и проверить в памяти. Это не должно создавать проблем с ограниченными ресурсами (если это возможно, вы можете оптимизировать позже):

filteredItems = allItems.filter { ($0.requests?.count ?? 0) != $0.sitesCount } 
Смежные вопросы