0

我有两个 NSDate 属性的实体:

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

我用它来创建点事件和持续时间事件。因此,对于点事件endTime可以等于零。

我想获取所有有限制的实体: 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 字段为零,并且字段 startTime 明显超过 minDate。

知道如何处理吗?不受 NSPredicate 的限制。我会处理任何决定。

4

2 回答 2

0

大概你想要:

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

尽管如果您将瞬时事件存储为具有相同的开始时间和结束时间会更容易。

于 2013-10-14T15:24:25.180 回答
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]];
于 2014-12-24T07:57:03.057 回答