Core Data 中的 URI 类型属性:如何使用 NSPredicate 进行查询

Posted

技术标签:

【中文标题】Core Data 中的 URI 类型属性:如何使用 NSPredicate 进行查询【英文标题】:URI typed attributes in CoreData: how to query with NSPredicate 【发布时间】:2022-01-08 04:36:08 【问题描述】:

我有一个CoreData-Entity,它存储一个名为“imageUrl”的“URI”类型的属性。 它用于存储 URL(如在 Swift URL / NSURL 中),例如。渲染远程图像。

如何查询 URI 类型属性的字符串表示形式?


示例:我想更精确地获取与 "http://mydomain.jpg"URL(string: "http://mydomain.jpg") 匹配的所有对象。

对于“字符串”类型的属性,这就足够了:

NSPredicate(format: "myStringAttribute LIKE %@", "http://mydomain.jpg")

以下内容是否适用于 URI 类型的属性?

NSPredicate(format: "imageUrl LIKE %@", URL(string: "http://mydomain.jpg"))

【问题讨论】:

它应该可以工作,因为根据developer.apple.com/documentation/coredata/…,URI 类型是URL LIKE 假定进行字符串比较,因此请使用 = 来比较 URL 对象。 @Larme thx,这是一个有用的参考! @JoakimDanielson 感谢您的发现。我能够使用NSPredicate(format: "imageUrl = %@", imageUrl as CVarArg) 成功查询,因为 XCode 抱怨 URL 不符合 CVarArg。 你也可以NSPredicate(format: "imageUrl = %@", argumentArray: [imageUrl]) 来避免演员阵容。旁注,我什至会使用%K 来避免拼写错误:NSPredicate(format: "%K = %@", argumentArray: [#keyPath(YourEntityClass.imageUrl), imageUrl]) 【参考方案1】:

我的回答是不要让这个问题没有答案,但在我看来,我们三个@nylki(作者)、@Joakim Danielson 和我自己一起回答了这个问题。那我把它标记为“社区维基”。

CoreData 中的URIURL 对象的一个​​。在NSAttributeDescription.AttributeTypeNSAttributeDescription.AttributeType.uri 的文档中是这样写的。

谓词中的LIKE 关键字用于字符串比较,如Predicate Format String Syntax 文档所述,因此我们需要改用=

所以答案是:

NSPredicate(format: "imageUrl = %@", imageUrl as CVarArg)

或者

NSPredicate(format: "imageUrl = %@", argumentArray: [imageUrl])

如果我们不想使用CVarArg

避免拼写错误的更好方法是使用%K 占位符,它代表%K is a var arg substitution for a key path.。合并到#keyPath()

NSPredicate(format: "%K = %@", argumentArray: [#keyPath(YourEntityClass.imageUrl), imageUrl])

这样,如果我们在错误"imageUrI = %@" 中使用大写的i 而不是可能看不到的l,我们会确保路径。

【讨论】:

以上是关于Core Data 中的 URI 类型属性:如何使用 NSPredicate 进行查询的主要内容,如果未能解决你的问题,请参考以下文章

如何将日期类型保存到 Swift Core Data 中实体的属性?

如何使用带有 Swift 的 Core Data 获取非标准(可转换)属性来更新/保存和持久化?

如何从Core Data中的字符串获取Processed字符串

iOS Core Data 无法从存储的 URI 打开图像

在已发布的应用程序中更改 Core Data 中的属性值

从一个复制并转换为 Core Data 中的另一个属性