the*_*end 4 cocoa core-data nspredicate
有没有办法在NSPredicate上执行DateAdd或DateDiff函数?谢谢你,何塞.
实际上,有!这是一种迂回的方式,因为NSPredicate它不直接支持它(即,你不能只是+ anInterval一个NSDate).幸运的是,你可以做到,幸运的是,我只是在2天前弄明白了.
澄清:我假设你要求的东西是:"一个对象有一个date属性.我想看看这个date属性是否是在另一个日期之前/之后的某个任意间隔".如果这就是你的意思,那么是的,你可以做到.如果这不是您的意思,那么请澄清您的问题.
开始了.在这个例子中,我们将承担行为,我们会评估这个谓词有一个名为属性的对象date返回的NSDate.我们将在另一个日期之前查看此日期是否至少1天.我们可以通过几种不同的方式进行比较:
date + 1 day is before comparisonDate
date is before comparisonDate - 1 day
Run Code Online (Sandbox Code Playgroud)
我将采用第一种方法:
NSDate * comparisonDate = ...; //an arbitrary NSDate object, against which we're going to be doing our comparison
NSTimeInterval interval = 86400; //the number of seconds you want add or subtract.
NSPredicate * p = [NSPredicate predicateWithFormat:@"CAST(CAST(date, 'NSNumber') + %f, 'NSDate') < %@", interval, comparisonDate];
Run Code Online (Sandbox Code Playgroud)
这是怎么回事:
为了使这个工作,我们可以CAST()将日期对象转换为NSNumber.这将转换NSDate为NSNumber从参考时间点(例如1970年1月1日或其他)的几秒钟.对于该数字,我们添加或减去我们的间隔,然后将新数字转换回NSDate.然后我们可以使用常规比较运算符来比较我们的新日期和我们的比较日期.
这个想法有几种不同的变化,但它们都需要NSDate将数字转换为数字(或将数字转换为a NSDate)以获得其时间间隔.
狡猾,嗯?
编辑
如果Core Data抱怨谓词的构造,请尝试颠倒:
NSDate * comparisonDate = ...;
NSTimeInterval interval = 86400;
NSPredicate * p = [NSPredicate predicateWithFormat:@"date < CAST(CAST(%@, 'NSNumber') - %f, 'NSDate')", comparisonDate, interval];
Run Code Online (Sandbox Code Playgroud)
编辑#2
The Reverend窃取的雷声:http://tumblr.com/xqorqjfrz
| 归档时间: |
|
| 查看次数: |
1307 次 |
| 最近记录: |