使用 NSPredicate 搜索核心数据实体的 NSArray 属性

Posted

技术标签:

【中文标题】使用 NSPredicate 搜索核心数据实体的 NSArray 属性【英文标题】:Using NSPredicate to search NSArray attribute of core data entity 【发布时间】:2012-01-13 03:28:03 【问题描述】:

我进行了广泛的搜索以找到解决此问题的方法。我所有的尝试都导致 0 结果。以下是一般数据结构:

Core Data Entity A 
  stringAttribute string
  ....
  transformableAttribute(NSArray of NSString objects) keywords

其中关键字 = [NSArray arrayWithObjects:@"string 1",@"string 2",@"string 3",nil]

我正在尝试运行谓词来搜索 NSArray 可转换属性。

我对实体 A 尝试了以下操作。核心数据存储是一个 sqlite 存储。

NSString *term = @"string 1";
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY keywords like[cd] %@", term];

----> 结果 0 个匹配项

NSArray *termArray = [NSArray arrayWithObject:@"string 1"];
NSPredicate *predicate = [NSPredicate predicateWithFormat@"ANY keywords in %@", termArray];

----> 结果 0 个匹配项

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SUBQUERY(keywords, $x, $x like %@).@count > 0", term]

---->导致非关系不能是子查询集合的错误

我已经尝试了上述的一些排列,但仍然没有结果。有什么建议吗?核心数据可以做到这一点吗?

谢谢!

【问题讨论】:

我认为如果您将字符串数组作为一个单独的实体并使用关系将它们连接起来,生活会更轻松。如果像这样实施,您尝试做的事情很容易。 是的,我认为单独的实体是最好的,就像在 SQL 中一样。我希望避免进行迁移,但找不到更好的方法。我正在使用 fetchedresutlscontrollers,它需要通过谓词获取,我无法手动过滤。 【参考方案1】:

我不使用transformableAttribute,这是我没有进入的核心数据元素,但如果我记得你不能对它们进行断言。 (所以如果我错了,请有人给我打电话)

但是当我看到你的transformableAttributearray of string 我只想说why do you want an array in a database?

为什么不建立关系?如果您的数组可以有不同数量的字符串,则为一对多关系。

核心数据是对数据库的抽象,在数据库中您不使用数组,而是使用表。这可能会简化你的生活并使获取成为可能。

【讨论】:

这似乎是真的。当我用 transformableAttribute 直接搜索 NSPredicate 时,很多人发现你做不到。可转换属性作为二进制数据存储在数据库中,因此对其执行 SQL 查询将不起作用。

以上是关于使用 NSPredicate 搜索核心数据实体的 NSArray 属性的主要内容,如果未能解决你的问题,请参考以下文章

带有核心数据的 NSPredicate,在字符串属性中搜索带有边界的单词

带有 NSNumber 的 NSArray 的 NSPredicate(核心数据)

NSPredicate 使用核心数据实体的属性

NSPredicate 搜索 NSSet

使用 JOIN 访问 NSPredicate 中的核心数据实体关系

NSPredicate 通过 NSSet 搜索