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 中的URI
是URL
对象的一个。在NSAttributeDescription.AttributeType
的NSAttributeDescription.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 获取非标准(可转换)属性来更新/保存和持久化?