用于从SwiftUI中的Core Data获取特定年份数据的 predicate

vnjpjtjt  于 2022-11-21  发布在  Swift
关注(0)|答案(1)|浏览(153)

我正在开发一个SwiftUI预算管理应用程序,它跟踪用户的支出和收入。该应用程序使用CoreData来管理数据管理。托管对象将日期作为一个属性。
我使用下面的fetch请求来获取数据

@SectionedFetchRequest(sectionIdentifier: \Expence.itemMonthYearShort, sortDescriptors: [SortDescriptor(\Expence.date, order: .forward)])
    private var expences : SectionedFetchResults<String, Expence>

这将给予分组数据,如2021年9月的费用
托管对象模型如下

extension Expence {
    
    @nonobjc public class func fetchRequest() -> NSFetchRequest<Expence> {
        return NSFetchRequest<Expence>(entityName: "Expence")
    }
    
    @NSManaged public var amount: Double
    @NSManaged public var date: Date
    @NSManaged public var id: UUID?
    @NSManaged public var type: Int16
    @NSManaged public var title: String?
    @NSManaged public var note: String?
    @NSManaged public var category: Category?
    
    public var wrappedNotes : String{
        note ?? ""
    }
    public var wrappedTitle : String{
        title ?? ""
    }
    
    @objc var itemMonthYear : String{
        return date.formatted(.dateTime.month(.wide).year())
    }
    @objc var itemMonthYearShort : String{
        return date.formatted(.dateTime.month(.abbreviated).year())
    }
    
    @objc var itemMonthYearDescending : String{
        return date.formatted(.dateTime.month(.wide).year()) + " "
    }
    
    @objc var itemMonth : String{
        return date.formatted(.dateTime.month(.abbreviated
                                             ))
    }
    @objc var itemYear : String{
        return date.formatted(.dateTime.year())
    }
}
extension Expence : Identifiable {

}

我想根据年份过滤数据。例如,我想显示特定年份的费用。我该如何编写 predicate 呢?

0yg35tkg

0yg35tkg1#

要查找特定年份的起点和终点,Calendar有一个dateInterval方法。例如:

let today = Date.now // => November 18, 2022
let thisYear = Calendar.current.dateInterval(of: .year, for: today)! // NB: note this is an Optional

let predicate = NSPredicate(format: "date >= %@ AND date < %@", thisYear.start as NSDate, thisYear.end as NSDate)

如果要查找特定的年份,可以创建一个日期,其年份与要筛选的年份相匹配,以此类推,而不是使用今天的日期作为起点。

相关问题