【问题标题】:Escape nonbreaking space as argument in NSPredicate将不间断空格作为 NSPredicate 中的参数转义
【发布时间】:2013-10-28 13:25:43
【问题描述】:

我想过滤掉空记录,但是我无法删除没有数据但有一系列空间的记录..

我有一个属性为 "name" 的实体 A。我想查询实体 A 的所有对象,这些对象具有属性名称的一些文本值而不是“空间系列”,换句话说,我需要将其合并到查询中 -->

[name stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet].length!=0

但我只能检查字符串的长度,包括不正确的空格。 我正在使用-->

     NSPredicate* predicate = [NSPredicate predicateWithFormat:@"name!=' ' or name.length!=0 "];

欢迎您提出建议。

【问题讨论】:

  • 您想要过滤掉的记录到底是什么样的?您真的是指“不间断空格”(Unicode U+00A0)吗?

标签: ios core-data nspredicate


【解决方案1】:

您可以像这样修剪字符串并检查字符串的长度:

NSString *trimmedString = [aRecordString stringByTrimmingCharactersInSet:[[NSCharacterSet characterSetWithCharactersInString:@" "]]];

if (trimmedString.lenght > 0) {

    // the string if valid or at least is not just a spaces string
}
else {

    // the string is not valid or was just a spaces string
}

因此,如果您想在谓词中应用此检查,您可以使用带有块的谓词:

    NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {

        // do your checks here and return TRUE or FALSE if the ovject match your criteria
}];

【讨论】:

  • 基于块的谓词不能在核心数据获取请求中使用。
【解决方案2】:

如果您尝试删除特定字符串属性仅包含空格的对象,请使用基于正则表达式的谓词,然后删除您找到的任何对象。

使用这样的谓词进行 fetch 会找到所有这些对象:

NSPredicate *reqPredicate = [NSPredicate predicateWithFormat:@"attributeName matches ' +'"];

找到后,使用-[NSManagedObjectContext deleteObject:] 删除生成的对象。

【讨论】:

    猜你喜欢
    • 2011-02-05
    • 1970-01-01
    • 2015-03-11
    • 1970-01-01
    • 2021-07-13
    • 1970-01-01
    • 1970-01-01
    • 2019-11-13
    • 1970-01-01
    相关资源
    最近更新 更多