在 CoreData / SwiftUI 的实体中显示属性中的最高数字
Posted
技术标签:
【中文标题】在 CoreData / SwiftUI 的实体中显示属性中的最高数字【英文标题】:Show the highest Number from an Attribute in an Entity from CoreData / SwiftUI 【发布时间】:2020-10-01 13:24:55 【问题描述】:我有一个实体,在这个实体中我有一些属性。例如:“天”。 我有一个标签,我想在那里显示“天”中保存的最高数字。 例如,用户归档 10、8、11、.. 天。 (标签中应为 11。所有数字都保存为“天”中的新实体。) 我该怎么做?
【问题讨论】:
你想直接从Core Data中获取最大值还是获取所有对象并从数组中获取最大值?无论哪种方式,这都是重复的,因此您应该能够通过一些研究找到答案。 这是我的数组。 @State var 卡片:[NSManagedObject] = [] 并在这个数组中全部保存。我想从属性“天”中获得最高的数字。那么我该怎么做呢? @JoakimDanielson 【参考方案1】:假设您的实体是 Cards 并且 days 是一个属性,那么您可以使用以下方法: 获取上下文,然后获取实体的所有对象,然后我们可以选择日期并找到最大值。
let delegate = UIApplication.shared.delegate as? AppDelegate
context = delegate?.persistentContainer.viewContext
guard let context = context else
return
let fetchRequest = NSFetchRequest<User>(entityName: "Cards")
do
let cards = try context.fetch(fetchRequest)
let maximumValue = cards.map$0.days.max()
catch
print(error.localizedDescription)
【讨论】:
【参考方案2】:您可以在获取请求中设置排序描述符。
let fetchRequest = NSFetchRequest<Entity>(entityName: "Entity")
let sortDescriptor = NSSortDescriptor(key: "days", ascending: false)
fetchRequest.sortDescriptors = [sortDescriptor]
do
result = try managedObjectContext.fetch(fetchRequest)
catch
获取结果中的第一个元素将包含最大的数字。
【讨论】:
【参考方案3】:这是一种以 SwiftUI 为中心的尝试方法,使用 @FetchRequest(因为问题是指带有 Core Data 的 SwiftUI)。
// Assuming Entity is named "Card" and attribute is "days"
struct ContentView: View
@Environment(\.managedObjectContext) private var viewContext
@FetchRequest(
sortDescriptors: [], predicate: nil, animation: nil)
private var cards: FetchedResults<Card>
var maxValue: Int
let daysArray = cards.compactMap$0.days as [Int]
return daysArray.max() ?? 0
var body: some View
Text("Highest Days: \(maxValue)")
上面获取所有卡片,然后使用计算属性 maxValue 来找到天的最大值。
或者,您可以允许 Core Data 在获取结果时对其进行排序,然后您可以依赖包含最大值的第一个结果:
@FetchRequest(
sortDescriptors: [NSSortDescriptor(keyPath: \Card.days, ascending: false)], predicate: nil, animation: nil)
private var cards: FetchedResults<Card>
var maxValue: Int
return cards.first?.days ?? 0
(FWIW,这篇文章帮助我解决了与您类似的需求:how-to-sum-filtered-core-data-in-swiftui)
【讨论】:
以上是关于在 CoreData / SwiftUI 的实体中显示属性中的最高数字的主要内容,如果未能解决你的问题,请参考以下文章
SwiftUI 2.0 / CoreData 2021:没有错误但实体未保存
过滤后的 SwiftUI CoreData 列表中的 Sum 属性