在 Core Data 可转换字符串数组上返回匹配项的 Swift 谓词

Posted

技术标签:

【中文标题】在 Core Data 可转换字符串数组上返回匹配项的 Swift 谓词【英文标题】:Swift predicate that returns matches on a Core Data transformable string array 【发布时间】:2020-11-15 20:26:43 【问题描述】:

我有一个核心数据实体,它有一个名为likedMovies 的属性,它是一个字符串数组[String]。这被配置为 Transformable 属性。

我在这个属性中填充了一个 ID 列表,例如:

用户实体:name = Duncan | likedMovies = [524, 558, 721]name = Saskia | likedMovies = [143, 558, 653]name = Marek | likedMovies = [655, 323, 112]

我想编写一个谓词,它返回所有User 实体,其中likedMovies 数组包含给定值。我尝试了下面的谓词,但它不起作用 - 对于 id 558,而不是返回 [Duncan, Saskia],我没有返回任何实体。

fetchRequest.predicate = NSPredicate(format: "%@ IN %@", "558", "likedMovies")

提前感谢您的帮助。

【问题讨论】:

【参考方案1】:

有两个问题:第一,你的谓词格式错误。您不能使用 %@ 作为属性名称的占位符;您必须改为使用 %K:

fetchRequest.predicate = NSPredicate(format: "%@ IN %K", "558", "likedMovies")

但第二个问题是可转换属性不能在谓词中用作获取请求的一部分(对于 SQLite 存储)。一种选择是使用谓词过滤内存中的用户对象(获取它们之后)。另一种选择是将 ID 数组表示为字符串(带有合适的分隔符),而不是字符串数组。然后,您可以使用CONTAINS 字符串运算符来创建谓词。但是向likedMovies 添加和删除ID 将成为一个相当笨拙的字符串操作过程。另一种选择是用一对多关系替换可转换属性。我推荐最后一个。

【讨论】:

非常感谢。我避免使用一对多关系,因为它不太可能有足够的数据来保证它 - 所以我可能只是手动循环遍历整个用户实体集。如果我没有得到任何其他答案,我会在 24 小时内将此标记为正确答案。 作为更新,我最终使用了字符串表示(因为实际上一旦设置它就永远不会改变,并且 ID 足够独特,不会导致任何搜索问题)。再次感谢!

以上是关于在 Core Data 可转换字符串数组上返回匹配项的 Swift 谓词的主要内容,如果未能解决你的问题,请参考以下文章

将自定义数组保存到 Core Data

如何使用 RKValueTransformer 将 NSString 转换为 Core Data NSManagedObject

C++怎么把string 转换为char型数组

如何在 Swift 中将字符串数组保存到 Core Data

仅获取共享特定属性值的 Core Data 对象

js进行字符串模式匹配