核心数据 nspredicate NSInvalidArgumentException

coredata nspredicate NSInvalidArgumentException

下面的谓词格式有什么问题?

    if (devices && devices.count > 0 && ![tf_Search.text isEqualToString:@""]) {
    NSString* strSearch = [NSString stringWithFormat:@"%@", tf_Search.text];
    NSPredicate* preFilter =
        [NSPredicate predicateWithFormat:@"(dRIV_NAMESURNAME CONTAINS[cd] %1$@) || (vEHI_PLATE CONTAINS[cd] %1$@)",
                     strSearch];
    devicesFitered = [devices filteredArrayUsingPredicate:preFilter];
}

devicesFiltered 数组不为空并且有 4 个核心数据设备实体。

dRIV_NAMESURNAME 和 vEHI_PLATE 是实体字段。 NSString.

它给出>“'NSInvalidArgumentException',原因:‘无法解析格式字符串’错误

如果我像下面两种格式一样单独使用它们,没问题

@"(dRIV_NAMESURNAME CONTAINS[cd] %@)" > 没问题

@"(vEHI_PLATE CONTAINS[cd] %@)" > 没问题

是关于 %1$@ 吗?

在 objc 中是否不可能像在 cSharp "{1} asdas da {1} sdfs {2}" 中那样处理输入"

正确的格式是什么?

不允许%1$@。最简单的解决方案就是重复 strSearch 参数:

    NSPredicate* preFilter = [NSPredicate predicateWithFormat:@"(dRIV_NAMESURNAME CONTAINS[cd] %@) || (vEHI_PLATE CONTAINS[cd] %@)", strSearch, strSearch];

如果你有一个很长的谓词和很多重复的参数,你也可以考虑使用 NSPredicatepredicateWithSubstitutionVariables 方法。见 Apple docs.