【问题标题】:search by date goes SIGABRT按日期搜索 SIGABRT
【发布时间】:2012-12-19 13:27:03
【问题描述】:

我正在使用这个实体,它有一个恰好是 Date 类型的 timeStamp 属性

当我尝试按日期执行搜索时,问题出现了:

NSDate *today = [NSDate date];
NSDate *end_day = [today dateByAddingTimeInterval: -5*one_day]; // the last 5 days
result = [helper fetchObjectsForEntityName:@"MyEntity" withPredicate:
[NSPredicate predicateWithFormat:@"timestamp > %f", [end_day ] ]];

当我打印出谓词的值时,我得到的只是:

timestamp > CAST(378132723.717909, "NSDate")

但是当语句被执行时,它会崩溃。 我在代码的其他部分使用相同的方法,并且没有问题,并且 显然,如果我删除 NSPredicate,它会再次起作用。

为了这个问题,这里也是 fetchObjectsForEnittyName: WithPredicate:

的代码
- (NSSet *)fetchObjectsForEntityName:(NSString *)newEntityName
                       withPredicate:(id)stringOrPredicate, ...
{
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:newEntityName];
    if (stringOrPredicate)
    {
        NSPredicate *predicate;
        if ([stringOrPredicate isKindOfClass:[NSString class]])
        {
            va_list variadicArguments;
            va_start(variadicArguments, stringOrPredicate);
            predicate = [NSPredicate predicateWithFormat:stringOrPredicate
                                               arguments:variadicArguments];
            va_end(variadicArguments);
        } else {
            NSAssert2([stringOrPredicate isKindOfClass:[NSPredicate class]],
                      @"Second parameter passed to %s is of unexpected class %@",
                      sel_getName(_cmd), @"Whatevah");
            predicate = (NSPredicate *)stringOrPredicate;
        }
        [request setPredicate:predicate];
    }

    NSError *error = nil;
    NSArray *results = [self.managedObjectContext executeFetchRequest:request error:&error];
    if (error != nil)
    {
        [NSException raise:NSGenericException format:[error description]];
    }

    return [NSSet setWithArray:results];
}

有人知道问题可能是什么吗?

【问题讨论】:

  • [NSPredicate predicateWithFormat:@"timestamp > %f", [end_day ] ]];这是什么意思? [结束日]
  • 打错了,应该是%@
  • 应该是 [NSPredicate predicateWithFormat:@"timestamp > %@", end_day];

标签: objective-c core-data nsdate


【解决方案1】:

第一件事是您将对象与标量进行比较并且有一些额外的括号,请尝试以下操作:

[NSPredicate predicateWithFormat:@"timestamp > %@", end_day];

要尝试的第二件事是属性的格式说明符,例如:

[NSPredicate predicateWithFormat:@"%K > %@", @"timestamp", end_day];

【讨论】:

    【解决方案2】:

    复杂的问题似乎是最简单的答案。

    我正在使用

     [NSPredicate predicateWithFormat:@"timestamp > %@", end_day]; 
    

    没有大写的 S,就像在我的实体中描述的一样! 所以应该是的

     [NSPredicate predicateWithFormat:@"timeStamp > %@", end_day];
    

    案件已解决。

    【讨论】:

    • nslog 常量字符串中的小写 's' 和大写字母 'S' 有何不同?你的意思是 [NSPredicate predicateWithFormat:@"timeStamp > %@", end_day];
    • 是的,这就是答案。我已经编辑了我的回复,使其更加清晰
    猜你喜欢
    • 2021-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-14
    • 2011-07-19
    • 2022-01-21
    相关资源
    最近更新 更多