在 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 记录

Swiftui中CoreData关系和显示图像列表

过滤后的 SwiftUI CoreData 列表中的 Sum 属性

SwiftUI从Core Data实体中获取总项目(SQL术语中的行)计数[重复]

SwiftUI CoreData 选择器问题