【问题标题】:How to use NSPredicate to search for ObjectID of a relationship attribute using CoreData in Swift 5?如何使用 NSPredicate 在 Swift 5 中使用 CoreData 搜索关系属性的 ObjectID?
【发布时间】:2020-08-05 18:42:59
【问题描述】:

我在尝试使用 NSPredicate仅获取 属于特定配置文件的数据时遇到了我的 CoreData 数据库问题.

let request: NSFetchRequest<Data> = Data.fetchRequest()
        
let predicate = NSPredicate(format: "ofProfile.name MATCHES %@", selectedProfile.name)
request.predicate = predicate
        
do {
    let result = try context.fetch(request)
} catch {
    print("Error fetching data: \(error)")
}
! The entity Data got a ofProfile attribute which is a One - To - Many Relationship to the Profile Entity

我的问题是,profile.name attribute 不是唯一的,因为可以有多个同名的配置文件。 没有 100% 唯一的属性

所以这是我的问题:有没有办法只获取一个特定配置文件的数据而没有唯一属性。也许使用活动个人资料的ObjectID

希望大家能想出解决这个问题的办法。非常感谢您提前提供的帮助。

【问题讨论】:

    标签: ios swift xcode core-data nspredicate


    【解决方案1】:

    如果您有一个Profile 对象,并希望获取与之相关的Data 对象,您可以使用:

    let predicate = NSPredicate(format: "ANY ofProfile == %@", selectedProfile)
    

    (如果是一对多关系),或者

    let predicate = NSPredicate(format: "ofProfile == %@", selectedProfile)
    

    (如果是一对一的话)。

    但同样,如果您有一个反向关系(并且您可能应该),假设称为 data,那么您可以使用它而无需获取:

    let relatedData = selectedProfile.data
    

    【讨论】:

    • 当然我有相反的关系,但我没有想到这一点;)非常感谢。你帮了我很多。因此,使用您的第三行代码,我无需执行获取请求即可获得一组数据对象。对吗?
    【解决方案2】:

    首先不要命名自定义类Data。 Foundation 框架中有一个结构体Data

    错误表明ofProfileNSSet,因此您不能应用此谓词。

    一种可能的解决方案是在ofProfile 类型中搜索匹配名称 数据 关系的记录。

    【讨论】:

    • 实体不称为数据。别担心,我只是在我的问题中将其命名为 Data for Simplicity。你的错误是什么意思,到目前为止我没有得到一个。并且代码完美运行。唯一的问题是,当我创建第二个同名配置文件时,两个配置文件的数据都会被加载。
    猜你喜欢
    • 2020-07-20
    • 2021-08-10
    • 1970-01-01
    • 2018-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多