在 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 谓词的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 RKValueTransformer 将 NSString 转换为 Core Data NSManagedObject