如何快速为 NSDate 做核心数据获取谓词?我想按月过滤

Posted

技术标签:

【中文标题】如何快速为 NSDate 做核心数据获取谓词?我想按月过滤【英文标题】:How to do core data fetch predicate for NSDate in swift? i want to filter it by months 【发布时间】:2015-11-23 20:39:19 【问题描述】:

// 获取数据

    var request = NSFetchRequest(entityName: "Users")
    request.returnsObjectsAsFaults = false;
    request.predicate = NSPredicate(format: "name = %@", txtUsername.text!)

    do 
        let results:NSArray = try context.executeFetchRequest(request) as! [NSManagedObject]

        if (results.count > 0)
            var res = results[0] as! NSManagedObject
            txtname.text = res.valueForKey("name") as! String
            txtPassword.text = res.valueForKey("password") as! String

            print(results.count)

不知道如何断言 NSdate,我的实体有三个属性,其中一个是日期类型,所以如果有人知道,请举个例子告诉我

【问题讨论】:

Using NSDate within an NSPredicate的可能重复 想要它在斯威夫特兄弟 Objectives-C 和 Swift 中的谓词是相同的。 我想用特定月份来预测它?该怎么做?? 【参考方案1】:

你可以这样做

获取一个月的第一个日期和最后一个日期,然后像这样使用

let startDate = NSDate().startOfMonth()
let endDate = NSDate().endOfMonth()
request.predicate = NSPredicate(format: "dateField >= %@ AND dateField <= %@", startDate!, endDate!)

其中 startDate 和 endDate 是 NSDate 变量。这将为您获取当前月份的数据。同样,您也可以在其他月份使用它。

您可以使用以下代码获取月份的开始和结束日期

extension NSDate 

    func startOfMonth() -> NSDate? 

        let calendar = NSCalendar.currentCalendar()
        let currentDateComponents = calendar.components([.Year, .Month], fromDate: self)
        let startOfMonth = calendar.dateFromComponents(currentDateComponents)

        return startOfMonth
    

    func dateByAddingMonths(monthsToAdd: Int) -> NSDate? 

        let calendar = NSCalendar.currentCalendar()
        let months = NSDateComponents()
        months.month = monthsToAdd

        return calendar.dateByAddingComponents(months, toDate: self, options: [])
    

    func endOfMonth() -> NSDate? 

        let calendar = NSCalendar.currentCalendar()
        if let plusOneMonthDate = dateByAddingMonths(1) 
            let plusOneMonthDateComponents = calendar.components([.Year, .Month], fromDate: plusOneMonthDate)

            let endOfMonth = calendar.dateFromComponents(plusOneMonthDateComponents)?.dateByAddingTimeInterval(-1)

            return endOfMonth
        

        return nil
    

【讨论】:

我以前试过这个,但是出错了,你能告诉我把这个放在哪里吗? @AnkitaShah 我需要把它放在课堂之外吗? @AnkitaShah 这是一个 NSDate 扩展。所以把它放在代码的末尾。我正在用示例编辑答案 是的。扩展将在类之外 在这一行抛出错误 - request.predicate = NSPredicate(format: "dateField >= %@ AND dateField

以上是关于如何快速为 NSDate 做核心数据获取谓词?我想按月过滤的主要内容,如果未能解决你的问题,请参考以下文章

带有谓词的核心数据获取请求。需要正确的 NSPredicate

谓词因从 Core Data 获取属性类型为“NSDate”对象的对象而失败

如何仅使用月份和日期从核心数据中获取

带有 NSdate 谓词的 NSFetchrequest

我无法根据与谓词的关系从核心数据中获取实体

核心数据获取请求中需要谓词?