0

我有两个NSDate的性质的实体:核心数据提取谓词的NSDate

@property NSDate *startTime; 
@property NSDate *endTime; 

我用它来创建点事件和时间的事件。所以,对于点事件endTime可以等于零。

,我想取得与限制所有实体:开始时间> =的minDate & &结束时间< =的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字段为零,而字段startTime明显多于minDate。

任何想法如何处理?不受NSPredicate限制。我会处理任何决定。

+0

在谓语开启和关闭括号不匹配。谓词中的“e”是什么? - 不应该是'“startTime> =%@ AND(endTime ==零或endTime <=%@)”'? –

+0

正确,刷新网站:)我已经做了一些修复。 –

回答

0

想必你想要的:

"((endTime != nil) and (startTime >= %@) and (endTime <= %@)) or 
((endTime = nil) and (startTime >= %@) and (startTime <= %@))", 
startTime, endTime, startTime, endTime 

虽然它会更容易,如果你瞬时事件存储为只是有相同的开始和结束时间。

+0

这对我有些副作用,但感谢最简单和简单的解决方案:)我关于保存相同的开始和结束时间。 –

+0

我讨厌自己过早的判断。具有相同日期的解决方案不起作用。如果搜索边界小于现有值,则谓词为true的解决方案,但如果它们更大,则不是这样。 –

+0

我只是将相同的数据保存到startTime和endTime,然后谓词 [NSPredicate predicateWithFormat:@“((startTime> =%@)和(endTime <=%@))”,startTime,endTime] 可以在所有情况下工作。再次感谢指导:) –

0

我正面临同样的问题。但解决了。核心数据本身以时间间隔格式存储NSDate。当您通过NSDate作为谓词的参数时,谓词将类型转换为时间间隔并进行比较。我做了同样的事但它没能返回结果。所以明确地将日期转换为时间间隔是可行的。

我希望得到的项目列表,它比maxCreatedDate少为createdDate和小于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]];