NSPredicate:按 NSDate 属性的日期过滤对象
我有一个带有 NSDate
属性的核心数据模型。我想按天过滤数据库。我认为解决方案将涉及 NSPredicate,但我不确定如何将它们组合在一起。
我知道如何使用 NSDateComponents
和 NSCalendar
比较两个 NSDate
的日期,但是如何使用 NSPredicate< 过滤它/代码>?
也许我需要在我的 NSManagedObject 子类上创建一个类别,该类别可以返回仅包含年、月和日的裸日期。然后我可以在 NSPredicate
中进行比较。这是您的建议,还是有更简单的方法?
I have a Core Data model with an NSDate
property. I want to filter the database by day. I assume the solution will involve an NSPredicate
, but I'm not sure how to put it all together.
I know how to compare the day of two NSDate
s using NSDateComponents
and NSCalendar
, but how do I filter it with an NSPredicate
?
Perhaps I need to create a category on my NSManagedObject
subclass that can return a bare date with just the year, month and day. Then I could compare that in an NSPredicate
. Is this your recommendation, or is there something simpler?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
给定一个 NSDate * startDate 和 endDate 以及一个 NSManagedObjectContext * moc:
Given a NSDate * startDate and endDate and a NSManagedObjectContext * moc:
有关如何将 startDate 和 endDate 设置为上述给出的答案的示例:
这里我正在搜索一个月内的所有条目。值得一提的是,这个示例还展示了如何搜索“nil”日期整体。
Example on how to also set up startDate and endDate to the above given answer:
Here I was searching for all entries within one month. It's worth to mention, that this example also shows how to search 'nil' date-entires.
Date 的 Swift 3.0 扩展:
然后使用如下:
Swift 3.0 extension for Date:
Then use like:
在 Swift 中,我得到了类似的内容:
我很难发现字符串插值
"\(this notation)"
不适用于比较 NSPredicate 中的日期。In Swift I got something similar to:
I had a hard time to discover that string interpolation
"\(this notation)"
doesn't work for comparing dates in NSPredicate.我将答案从 Glauco Neves 移植到 Swift 2.0 并将其包装在一个接收日期并返回
的函数中对应日期的 NSPredicate
:I ported the answer from Glauco Neves to Swift 2.0 and wrapped it inside a function that receives a date and returns the
NSPredicate
for the corresponding day:添加 Rafael 的答案(非常有用,谢谢!),移植到 Swift 3。
Adding to Rafael's answer (incredibly useful, thank you!), porting for Swift 3.
基于之前的答案,使用 Swift 5.x 进行更新和替代方法
如果您希望将
endOfDay
创建时间为晚上 11:59:59,则可以包括...但是那么您可以将 NSPredicate 更改为...
...具体说明
day
day
day
day
day
day
day
%@
至日 <= %@
。Building on the previous answers, an update and alternative method using Swift 5.x
If you'd prefer to create the time for
endOfDay
as 11:59:59 PM, you can instead include...but then you might change the NSPredicate to...
...with specific note of the change from
day < %@
today <= %@
.我最近花了一些时间尝试解决同样的问题,并将以下内容添加到准备开始和结束日期的替代方案列表中(包括 iOS 8 及更高版本的更新方法)...
...以及 NSPredicate 核心数据
NSFetchRequest
(如上面其他答案中所示)...I've recently spent some time attempting to solve this same problem and add the following to the list of alternatives to prepare start and end dates (includes updated method for iOS 8 and above)...
...and the
NSPredicate
for the Core DataNSFetchRequest
(as already shown above in other answers)...对我来说这是有效的。
我已经过滤了从当前日期到 7 天前的数组。我的意思是我正在获取从当前日期起一周的数据。这应该有效。
注意:我将以毫秒为单位的日期转换为 1000,然后进行比较。如果您需要任何澄清,请告诉我。
For me this is worked.
I have filtered array from current date to 7 days back. I mean I am getting one week data from current date. This should work.
Note: I am converting date which is coming with milli seconds by 1000, and comparing after. Let me know if you need any clarity.