【问题标题】:Predicate for fetching the data for a particular year from Core Data in SwiftUI在 SwiftUI 中从核心数据中获取特定年份数据的谓词
【发布时间】:2022-11-19 22:30:39
【问题描述】:

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

我使用下面的获取请求来获取数据

 @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 {

}

我想根据年份过滤数据。例如,我想显示特定年份的费用。我怎样才能为那个写谓词?

【问题讨论】:

    标签: swift core-data predicate nsdatecomponents


    【解决方案1】:

    要查找特定年份的起点和终点,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)
    

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

    【讨论】:

    • 您可以使用NSPredicate(format:argumentArray:)并避免使用as NDSDateNSPredicate(format: date &gt;= %@ AND date &lt; %@, argumentArray: [thisYear.start, thisYear.end)])
    • @Larme 直到!我现在要重构我所有的代码了……!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-13
    相关资源
    最近更新 更多