Ios 核心数据-NSPredicate筛选出空字符串工作不正确

Ios 核心数据-NSPredicate筛选出空字符串工作不正确,ios,core-data,Ios,Core Data,我在项目中使用核心数据已有一段时间了。几天前,我发现数据库中保存的一些记录并没有显示在应用程序UI中。我找到了它,发现当我使用NSPredicate过滤掉空字符串时,它们根本没有被提取出来。它们都以非字母字符开头 为了澄清这个问题,我创建了一个示例项目,并在数据库中添加了一些示例数据。假设它们是“Sample”,“Sample”,“Sample+” 下面是我用来过滤空字符串的代码片段。“text”是字符串属性的名称,moc是NSManagedObjectContext实例 NSFetchRequ

我在项目中使用核心数据已有一段时间了。几天前,我发现数据库中保存的一些记录并没有显示在应用程序UI中。我找到了它,发现当我使用NSPredicate过滤掉空字符串时,它们根本没有被提取出来。它们都以非字母字符开头

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

下面是我用来过滤空字符串的代码片段。“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个谓词

我想知道是否有人经历过同样的问题。还是我在使用核心数据时遗漏了什么? 在iOS 7.0.3模拟器和7.0.6 iPad Air上测试


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

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"text MATCHES %@", @".{1,}"];
不过,我相信我使用的原始谓词是有效的。我将向苹果公司提交一个bug,征求他们的意见。

试试这个:

NSPredicate *predicateName = [NSPredicate predicateWithFormat:@"name!=nil AND name!="""];
这就是你想要的

[NSPredicate predicateWithFormat:@"%K != %@", @"text", @""]
如果您还需要检查
nil
/
NULL
请执行以下操作:

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

可能重复@BenAvery是的,使用匹配项可以作为一种解决方法。但我不相信NSPredicate中sting的长度属性是无效的。它可以过滤出文本长度为0的实体,并与[NSArray filteredArrayUsingPredicate:]配合使用。我想知道这是否是我的误解,或者我必须向Apple提交一个bug。尝试在没有谓词的情况下运行fetch,并检查它返回的元素。如果它正好包含您期望的所有字符串,那么问题可能在于谓词。否则,问题可能在于在将字符串存储到Core中之前,您用于创建字符串的编码。@ryancumley它会在不带谓词的情况下获取所有记录。而且,正如我在上面所写的,同样的谓词在过滤数组时工作得很好。这就是为什么我认为这可能是核心数据中的一个bug。我在代码中硬编码了示例字符串,因此编码可能也不是这样。无论如何,谢谢你的意见。我将向苹果公司提交一个bug,以从苹果公司的家伙那里得到一些答案。这家伙有一个确切的问题:显然,在核心数据获取请求中禁止使用像length这样的Obj-C函数,因为这不会编译。