【发布时间】:2020-01-10 12:16:25
【问题描述】:
如何在 SwiftUI 应用中对过滤后的 Core Data 值求和(使用谓词)?
我有 1 个名为 NPTransaction 的实体。它有 5 个属性,我想对名为 value (Integer 64) 的属性的值求和。基本上,它将汇总所选月份的收入值(现在它在示例代码中设置为 current Date(),但稍后将设置为整个当前月份)。
我发现了关于 Swift 的类似问题,但我无法让这段代码在我的应用程序中运行。 相关问题链接:How to sum the numbers(Int16) of stored core data - Swift 3
根据链接中的代码,我现在有以下代码:
import SwiftUI
struct DashboardView: View {
@Environment(\.managedObjectContext) var managedObjectContext
@State var selectedDate = Date()
// This code in private var below produces many errors like:
// Value of type 'AppDelegate' has no member 'managedObjectContext'
// Use of undeclared type 'NSEntityDescription'
// Use of undeclared type 'NSFetchRequest'
// - so I assume that this linked question may be outdated or I should take different approach using SwiftUI
private var income: Int64 {
let context = (UIApplication.shared.delegate as! AppDelegate).managedObjectContext
let entityDesc: NSEntityDescription = NSEntityDescription.entity(forEntityName: "NPTransaction", in: context)!
let request: NSFetchRequest<NSFetchRequestResult> = NSFetchRequest()
request.entity = entityDesc
request.predicate = NSPredicate(format: "date == %@", selectedDate)
let records = try! context.fetch(request)
try! context.fetch(request) as! [NSManagedObject]
let monthlyIncome = result.reduce(0) { $0 + ($1.value(forKey: "value") as? Int64 ?? 0) }
return monthlyIncome
}
var body: some View {
NavigationView {
VStack {
Text("Monthly income:")
Text("\(income) USD")
}
// more code...
我只是在学习 Swift 和 SwiftUI,所以也许有更好的完全不同的方法来解决这个问题?
【问题讨论】:
-
NSExpressionDescription 很有用。例如stackoverflow.com/questions/49099914/…
-
请记住 Date() 包含时间,因此您的谓词不太可能匹配任何对象。我将从删除谓词开始,以获得工作代码来计算所有值的总和。然后稍后再添加谓词 - 要获得“今天的总数”,您将需要相当于“日期 > 昨晚午夜和日期
-
谢谢,pbasdf,好点子。不过,我已经解决了这个日期谓词。我也欢迎仅针对 date > Date() 的解决方案。我仍然无法解决的问题是如何对数据求和。
-
Gagan_iOS,谢谢,但您的链接中的问题没有得到解答。我不知道如何正确使用 NSExpressionDescription,也找不到有效的 SwiftUI 示例
标签: ios swift core-data swiftui