我的nspredicate是否需要一个子查询才能正常工作?

时间:2018-12-23 03:39:25

标签: subquery nspredicate

我有一系列自定义对象,这些对象具有床(1,2,3),壁炉(是或否),书房(是或否)和天花板高度(9-11,11-14,14-16) 。我需要允许基于任何/全部/没有被选择作为过滤依据的项目进行过滤。因此,用户可能希望看到1和2张床,书房,壁炉和9-11英尺的天花板。或仅1和2张床。我当前的谓词适用于其中一些。但这并不能全部-只是有些。我在想我需要一个子查询。如何基于过滤器数组创建nested(?)子查询?

现在,用户选择按钮,并且这些按钮与“过滤器”匹配,而我使用这些按钮来创建我的谓词。

当前谓词

    Filters is an array of keys and predicate strings like 'beds, 1' and 'ceilings, 9-11'

`NSMutableArray *subPredicates = [NSMutableArray array];

    for (Filter*fil in filters) {
        NSPredicate *unitsPredicate = [NSPredicate predicateWithFormat:@"%K == %@", fil.key, fil.predicate];
        [subPredicates addObject:bedsPredicate];
    }

    NSPredicate *predicate = [NSCompoundPredicate andPredicateWithSubpredicates:subPredicates];    
    NSLog(@"homes: %@", [searchArray filteredArrayUsingPredicate:predicate]);
    NSArray *ar = [searchArray filteredArrayUsingPredicate:predicate];

我想允许某人选择任何条件并返回适当的数据。

1 个答案:

答案 0 :(得分:1)

子查询用于多对多关系。如果要过滤多个值,则fil.predicate的类应为值的数组(或集合)。谓词格式为%K IN %@,例如

for (Filter*fil in filters) {
    NSPredicate *unitsPredicate;
    if ([fil.predicate isKindOfClass:[NSArray class]])
        unitsPredicate = [NSPredicate predicateWithFormat:@"%K IN %@", fil.key, fil.predicate];
    else
        unitsPredicate = [NSPredicate predicateWithFormat:@"%K == %@", fil.key, fil.predicate];
    [subPredicates addObject:bedsPredicate];
}
NSPredicate *predicate = [NSCompoundPredicate andPredicateWithSubpredicates:subPredicates];    

请参见Aggregate Operations in Predicate Programming Guide