核心数据 - NSPredicate 过滤掉工作不正确的空字符串

Posted

技术标签:

【中文标题】核心数据 - NSPredicate 过滤掉工作不正确的空字符串【英文标题】:Core Data - NSPredicate to filter out empty string working incorrect 【发布时间】:2014-02-27 23:42:55 【问题描述】:

我在我的项目中使用核心数据已经有一段时间了。几天前,我发现一些保存在数据库中的记录没有显示在应用程序 UI 中。我已经对其进行了追踪,发现当我使用 NSPredicate 过滤掉空字符串时,它们根本没有被获取。而且它们都以非字母字符开头。

为了澄清问题,我创建了一个示例项目并将一些示例数据添加到数据库中。假设它们是“Sample”、“+ sample”、“Sample +”。

这是我用来过滤空字符串的代码 sn-p。 "text" 是字符串属性的名称,moc 是 NSManagedObjectContext 实例。

NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"BasicEntity"];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"text.length > 0"];
[request setPredicate:predicate];

NSArray *samples = [moc executeFetchRequest:request error:&error];

结果数组只包含两个实体,分别是“Sample”和“Sample +”。

我什至在包含上述示例字符串的简单数组上尝试了相同的谓词(当然,使用 self.length 而不是 text.length),并且我正确地得到了所有 3 个。

我想知道是否有人遇到过同样的问题。还是我在使用 Core Data 时遗漏了什么? 在 ios 7.0.3 模拟器和 7.0.6 iPad Air 上测试。


更新:正如另一个线程中的回答,我通过使用正则表达式解决了这个问题。

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"text MATCHES %@", @".1,"];

不过,我相信我使用的原始谓词是有效的。我会向 Apple 提交错误以征求他们的意见。

【问题讨论】:

可能重复***.com/questions/19889211/… @BenAvery 是的,使用 MATCHES 可能是一种解决方法。但我不相信 NSPredicate 中 sting 的长度属性是无效的。它确实会过滤掉长度为 0 的文本的实体,并且与 [NSArray filteredArrayUsingPredicate:] 配合得很好。我想知道这是我的误解,还是我必须向 Apple 提交错误。 尝试在没有谓词的情况下运行 fetch,并检查它返回的元素。如果它包含您期望的所有字符串,那么问题可能出在谓词上。否则问题可能出在您用于创建字符串的编码上,然后再将它们存储在 Core 中。 @ryancumley 它在没有谓词的情况下获取每条记录。而且,正如我在上面所写的,在过滤数组时,相同类型的谓词效果很好。这就是为什么我认为这可能是 Core Data 中的一个错误。我在代码中对示例字符串进行了硬编码,因此编码也可能不是这种情况。无论如何,谢谢你的意见。我会向 Apple 提交一个错误,以从 Apple 人那里得到一些答案。 这家伙的问题是:***.com/questions/22767022/… 显然在你的核心数据获取请求中禁止使用像 length 这样的 Obj-C 函数 【参考方案1】:

这就是你想要的

[NSPredicate predicateWithFormat:@"%K != %@", @"text", @""]

如果您还需要检查nil / NULL,请执行以下操作:

[NSPredicate predicateWithFormat:@"%K != NULL && %K != %@", @"text", @"text", @""]

【讨论】:

【参考方案2】:

试试这个:

NSPredicate *predicateName = [NSPredicate predicateWithFormat:@"name!=nil AND name!="""];

【讨论】:

这不会编译。

以上是关于核心数据 - NSPredicate 过滤掉工作不正确的空字符串的主要内容,如果未能解决你的问题,请参考以下文章

过滤掉子类结果的 NSPredicate

使用 NSPredicate 过滤核心数据中的对象

NSPredicate 按属性过滤核心数据关系 NSSet

核心数据:过滤多对可能与 NSPredicate 的关系

采用核心数据,按多个标准过滤。我想要 NSPredicate 吗?

使用 NSPredicate 过滤核心属性和实体