核心数据 - 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 过滤掉工作不正确的空字符串的主要内容,如果未能解决你的问题,请参考以下文章