2017-07-01 2 views
1

Ceci est ma demande de récupération:Comment effectuer une requête d'extraction pour obtenir la somme des paramètres avec la description de l'expression?

let request = NSFetchRequest<Service>() 
    let sorter = NSSortDescriptor(key: "date", ascending: true) 

    let entity = NSEntityDescription() 
    entity.name = "Service" 
    request.entity = entity 
    request.sortDescriptors = [sorter] 
    request.resultType = .dictionaryResultType 
    request.predicate = NSPredicate(format: "month.identifier = 201703") 

    let exp = NSExpressionDescription() 
    exp.expression = NSExpression(forKeyPath: "@sum.duration") 
    exp.expressionResultType = .integer64AttributeType 
    request.propertiesToFetch = [exp] 

    do { 
     let result = try NSManagedObjectContext.mr_default().fetch(request) //error is here 
     print("+++++ \(result)") 
    } catch { 
     print(error) 
    } 

Mais il produit une erreur:

* Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '* -[__NSArrayM insertObject:atIndex:]: object cannot be nil'

Pourquoi?

Répondre

2

Définissez le nom de NSExpressionDescription. Le nom est la clé qui sera utilisée dans le dictionnaire pour la valeur de retour. J'ai changé le type de résultat pour la requête d'extraction pour le faire fonctionner pour le type de dictionnaire.

let request = NSFetchRequest<NSFetchRequestResult>() 
    let sorter = NSSortDescriptor(key: "date", ascending: true) 

    let entity = NSEntityDescription() 
    entity.name = "Service" 
    request.entity = entity 
    request.sortDescriptors = [sorter] 
    request.resultType = .dictionaryResultType 
    request.predicate = NSPredicate(format: "month.identifier = 201703") 

    let exp = NSExpressionDescription() 
    exp.name = "sumOfduration" 
    exp.expression = NSExpression(forKeyPath: "@sum.duration") 
    exp.expressionResultType = . integer64AttributeType 
    request.propertiesToFetch = [exp] 

    do { 
     let result = try UMUserDBManager.sharedInstance.getThreadManagedObjectContext().fetch(request) //error is here 
     print("+++++ \(result)") 
    } catch { 
     print(error) 
    } 

}