我有两个NSDate属性的实体:
@property NSDate *startTime;
@property NSDate *endTime;
我用它来创建点事件和持续时间事件。因此,对于点事件endTime
可以等于nil。
我想要获取所有限制的实体:startTime> = minDate&& endTime< = maxDate
但NSPredicate喜欢:
NSDate *startTime = [[NSUserDefaults standardUserDefaults] objectForKey:@"firstBound"];
NSDate *endTime = [[NSUserDefaults standardUserDefaults] objectForKey:@"secondBound"];
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"(startTime >= %@) AND ((endTime <= %@) OR (endTime == nil))",startTime,endTime]];
无效。我会解释。如果存储在数据库中的所有事件都在2000 - 2010年的范围内,并且我正在使用minDate = 1900进行提取,则maxDate = 1950一切来自数据库的点事件都适合此谓词,因为它们的endTime字段为nil,并且字段startTime明显超过minDate。
知道怎么处理这个吗?不要受NSPredicate的限制。我会做出任何决定。
答案 0 :(得分:0)
大概你想要:
"((endTime != nil) and (startTime >= %@) and (endTime <= %@)) or
((endTime = nil) and (startTime >= %@) and (startTime <= %@))",
startTime, endTime, startTime, endTime
虽然将瞬时事件存储为具有相同的开始和结束时间会更容易。
答案 1 :(得分:0)
我遇到了同样的问题。但得到了解决。核心数据本身以时间间隔格式存储NSDate。当您将NSDate
作为谓词的参数传递时,谓词将键入将其转换为时间间隔并进行比较。我做了同样的但它没有返回结果。因此,明确地将日期转换为时间间隔。
我想获取createdDate
小于maxCreatedDate
且小于minCreatedDate
对于我的问题,我使用如下:
[NSPredicate predicateWithFormat:@"createdDate >= %f AND createdDate <= %f", [minCreatedDate timeIntervalSince1970], [maxCreatedDate timeIntervalSince1970]];
这对我有用。你可以试试这个:
[NSPredicate predicateWithFormat:@"(startTime >= %f) AND ((endTime <= %f) OR (endTime == nil))",[startTime timeIntervalSince1970], [endTime timeIntervalSince1970]];