【问题标题】:iOS Swift Summing up CoreData attribute valuesiOS Swift 总结 CoreData 属性值
【发布时间】:2016-01-05 16:52:10
【问题描述】:
Setup: Xcode version: 7.1 Beta, 
Firmware: iOS 9, 

我正在尝试从 Core Data 获取一个值,以获取所购买产品的总额。我已经检查了一个问题,但它在 Obj C 中。CoreData 详细信息:

实体:购物车

属性:fName (String), fCost (Integer 16), fQuantity (Integer 16)

检索代码如下:

let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate
let managedContext : NSManagedObjectContext = appDelegate.managedObjectContext!
let fetchRequest = NSFetchRequest(entityName: "Cart")
fetchRequest.returnsObjectsAsFaults = false
do {
    let results = try managedContext.executeFetchRequest(fetchRequest)
    print("===\(results)")

} catch let error as NSError {
    print(error)
}

打印(结果)输出如下:

[<Tif.Cart: 0x7f8d19e60d00> (entity: Cart; id: 0xd000000000240000 <x-coredata://5D617B2C-35BC-43B4-BEC1-40AABA96C558/Cart/p9> ; data: {
    fCost = 30;
    fName = "Milk";
    fQuantity = 2;
}), <Tif.Cart: 0x7f8d19e7cd80> (entity: Cart; id: 0xd000000000280000 <x-coredata://5D617B2C-35BC-43B4-BEC1-40AABA96C558/Cart/p10> ; data: {
    fCost = 60;
    fName = "Butter";
    fQuantity = 1;
})]

我正在使用tableView单元格显示核心数据并执行总计。

var cart = [NSManagedObject]()
let order = cart[indexPath.row]
cell.fNLabel.text = order.valueForKey("fName")! as? String
cell.fCLabel.text = "Rs \(order.valueForKey("fCost") as! NSNumber)"
cell.fQLabel.text = "\(order.valueForKey("fQuantity") as! NSNumber)"
let fQ = order.valueForKey("fQuantity") as! Int
let fC = order.valueForKey("fCost") as! Int
let total = fQ * fC
totalArray.append(total)
grandTotal = totalArray.sum() // sum() is an extension that calculates the sum of integer values
print(grandTotal)
grandTotalLabel.text = "\(grandTotal)"
cell.fTLabel.text = "Rs \(total)"

我得到了 grandTotal,但每次我拉表时,都会将值添加到最后一个值。

我还阅读了有关使用 NSFetchRequestController 选项的信息,但我根本无法使用它。

【问题讨论】:

    标签: ios swift uitableview core-data xcode7.1beta


    【解决方案1】:

    您似乎正在使用tableView:cellForRowAtIndexPath: 方法计算总计。这绝对不是这样做的正确位置,因为它只会计算可见单元格的总数。

    let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate
    let managedContext : NSManagedObjectContext = appDelegate.managedObjectContext!
    let fetchRequest = NSFetchRequest(entityName: "Cart")
    fetchRequest.returnsObjectsAsFaults = false
    do {
        let results = try managedContext.executeFetchRequest(fetchRequest)
        print("===\(results)")
    
        // Calculate the grand total...
        var grandTotal = 0
        for order in results {
            let fQ = order.valueForKey("fQuantity") as! Int
            let fC = order.valueForKey("fCost") as! Int
            grandTotal += fC * fQ
        }
        print("Grand total = \(grandTotal)")
    
    } catch let error as NSError {
        print(error)
    }
    

    【讨论】:

    • 对不起,我会说清楚的。我想得到总和,它将是所有 fQuantity * fCost 的总和。例如:fName: Milk, fQuantity: 2, fCost: 30. fName: Butter, fQuantity: 1, fCost = 60. 所以我想得到 (2*30) + (1*60) = 160 -> grandTotal。您的解决方案有效,但它给了我牛奶的 fCost (30) + 黄油的 fCost(60) = 90。这可能很容易,但尝试了很多事情,我认为我只是让它太复杂了。你能更新你的解决方案吗?谢谢
    • 抱歉,我忽略了数量。我想你想多了,一个简单的循环就足够了,我会更新我的答案......
    • 好的,我搞定了。我删除了我的评论,因为它没有意义。你的答案有效。只需添加 valueForKey。请接受编辑,以便我可以接受答案。我在编程方面还不够成熟。谢谢理解。
    • AFAIK 如果实体是从 Core Data 以纯 NSManagedObject 返回的,则您只需要 valueForKey:。您可以创建自己的自定义子类并从类型安全中受益。但这是一个不同的问题:D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-15
    • 2018-03-25
    相关资源
    最近更新 更多