2016-11-27 20 views
0

私のアプリでは、いくつかのトランザクションを日付別に追加しました。各取引にはamountフィールドがあり、指定された範囲のすべての取引の合計を計算したいと思います。コアデータの週の毎日の合計を計算する方法

これはどのようにしてコアデータで行うことができますか?

私は二つの方法を考えていますDateの範囲にわたり

  1. 反復とNSFetchRequest

から各反復

  • 使用propertiesToGroupBypropertiesToFetchのための合計を計算は、このの1良い近づいていますか?あるいはこれを行うための他の方法がありますか?私はこのようにそれを行うために管理

  • +0

    'sum'を使って' propertiesToGroupBy'を設定すると、アプリケーションは単に結果を収穫するだけで、DB内の作業を行います。結果のコードは読みやすくなります。 – dasblinkenlight

    +0

    これを行う方法の例がありますか?私はpropertiesToGroupByを使用しようとしましたが、私は結果の型を辞書に設定しなければなりません。 – Kobe

    +0

    [ここでは、 'propertiesToGroupBy'(http://stackoverflow.com/a/28014825/335858)で合計を計算する方法を示すQ&Aです。 – dasblinkenlight

    答えて

    0

    :今

    let amountExpr = NSExpression(forKeyPath: "amount") 
    let sumExpr = NSExpression(forFunction: "sum:", arguments: [amountExpr]) 
    let sumDescr = NSExpressionDescription() 
    sumDescr.expression = sumExpr 
    sumDescr.name = "sumOfAmount" 
    sumDescr.expressionResultType = .doubleAttributeType 
    
    let dateExpr = NSExpression(forKeyPath: "date") 
    let dateDescr = NSExpressionDescription() 
    dateDescr.expression = dateExpr 
    dateDescr.name = "date" 
    dateDescr.expressionResultType = .dateAttributeType 
    
    let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Transaction") 
        request.sortDescriptors = Transaction.defaultSortDescriptors 
        request.propertiesToFetch = [dateDescr, sumDescr] 
        request.propertiesToGroupBy = [dateDescr] 
        request.resultType = .dictionaryResultType 
        request.returnsObjectsAsFaults = false 
        request.predicate = Transaction.rangeOfDatesPredicate(dateRange: Date.week()) 
    let results = try! context.fetch(request) as! [NSDictionary] 
    
    for value in results { 
        print(value) 
    } 
    

    valueは、値としてキーとの和として日付と辞書になります。

    :この作品を作るために、私は、そうでない場合は、すべての日付が異なるだろう、コアデータに追加されたすべての日を同じにするための時間を調整する必要があります。

    extension Date { 
        static func current() -> Date { 
         let calendar = Calendar.current 
    
         var components = calendar.dateComponents([.year, .month, .day], from: Date()) 
         components.hour = 00 
         components.minute = 00 
         components.second = 00 
    
         return calendar.date(from: components)! 
        } 
    } 
    
    関連する問題