【问题标题】:NSInvalidArgumentException', reason: 'Unknown predicate type for predicate: BLOCKPREDICATE(0x70ad750)' ErrorNSInvalidArgumentException',原因:'未知谓词类型的谓词:BLOCKPREDICATE(0x70ad750)'错误
【发布时间】:2012-05-14 06:29:53
【问题描述】:

我有一个核心数据数据库,我正在尝试使用块谓词创建一个获取请求,但我收到一个未知谓词错误:

注意:employeeToHouse 是一个 House 类型的属性,它是在我继承 NSManagedObject 时为我创建的

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Place"];
request.predicate       = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {
    Place *sortPlace            = (Place *)evaluatedObject;
    CLLocation *placeLocation   = [[CLLocation alloc] initWithLatitude:sortPlace.latitude.doubleValue 
                                                             longitude:sortPlace.longitude.doubleValue];
    CLLocationDistance distance = [placeLocation distanceFromLocation:self.userLocation];
    sortPlace.distanceToUser    = [NSNumber numberWithDouble:distance];
    if(distance<3000)
    {
        return YES;
    }
    return NO;
}];
request.sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@ "distanceToUser" 
                                                                                 ascending:YES 
                                                                                  selector:@selector(localizedCaseInsensitiveCompare:)]];

[self.loadingView removeSpinner];
[self setupFetchedResultsControllerWithFetchRequest:request];

然后我得到这个错误:

NSInvalidArgumentException',原因:'未知谓词类型 谓词:BLOCKPREDICATE(0x70ad750)'

我是不是做错了什么?

【问题讨论】:

  • 您使用的是“未知谓词类型”吗?
  • 嗯,这就是错误消息的内容。
  • @C4- Objective C 代码是这样格式化的吗?太丑了。
  • 另外,在一个完全不相关的注释中,distanceFromLocation 有一个错误。如果您颠倒这两个位置(如distance = [self.userLocation distanceFromLocation:placeLocation];),您将获得不同的值,即使无论您走哪条路,距离都应该相同。将两个距离取平均值即可得到正确的值。
  • 我想我明白了。我花了一段时间,但似乎(我不完全确定)核心数据不支持 Block 谓词,因为它们无法转换为 SQLite。好吧,看来我需要寻找解决方法。

标签: iphone objective-c core-data predicate nsfetchrequest


【解决方案1】:

AFAIK 你不能在 CoreData 中使用块谓词。

在此处查看投票最多的答案:NSFetchRequest and predicateWithBlock

原因是 CoreData 无法将块中包含的 C 代码转换为 SQL 查询。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-02
    • 2018-05-16
    • 1970-01-01
    • 1970-01-01
    • 2020-01-05
    • 2020-01-27
    • 2015-08-12
    相关资源
    最近更新 更多