【问题标题】:SQL type fetch request from core data从核心数据获取 SQL 类型的请求
【发布时间】:2018-09-23 14:05:00
【问题描述】:

虽然有类似的主题,但在堆栈溢出中,我将在下面描述的问题没有明确的答案。为简单起见,我将简化实体。所以:核心数据中有两个实体:

第一个名为 Person 的实体具有以下属性:
名字
姓氏
城市

第二个实体:国家,属性:
城市
资本

这个想法是,在一个视图控制器中,用户通过表单为第二个实体添加值 - 为国家填写城市和首都信息。 在其他视图控制器中,用户填写名字和姓氏,但从选择器视图中选择城市,该选择器视图已经从其他视图控制器中添加的数据中填充。

在第三个视图控制器中,我想获取第一个添加资本的实体(表视图控制器中的所有信息),例如如果第一个实体包含数据:
John |琼斯 |芝加哥
默认情况下,第二个应该有一行包含以下数据:
芝加哥 |华盛顿

如何将“华盛顿”分配给“约翰”?

与这个问题类似,但没有明确的答案:Selecting columns from different entities

【问题讨论】:

    标签: ios swift database fetch predicate


    【解决方案1】:

    我想出了下一个数据库方案:

    Entity:
        City
          Attributes:
            id: Integer 16
            name: String
          Relationships:
            [o] capitalOfCountryOptional: Country, inverse: capital
            [o] country: Country, inverse: cities
            [m] people: Person, inverse: city
    
        Country
          Attributes:
            id: Integer 16
            name: String
          Relationships:
            [o] capital: City, inverse: capitalOfCountryOptional
            [m] cities: Person, inverse: city
    
        Person
          Attributes:
            id: Integer 16
            firstName: String
            flastName: String
          Relationships:
            [o] city: City, inverse: people
    

    一旦您需要一些人员信息并且您知道 id:

    现在您可以创建所有需要的对象并设置为关系:

    let country = ... Ukraine
    let city = ... Lviv
    let capital = ... Kyiv
    let person = ... John Doe
    
    country.capital = capital
    city.country = country
    person.city = city
    

    然后你需要保存你的上下文,你可以检索人员信息:

    import CoreData
    public class MOPerson: NSManagedObject {    
        static func getPerson(id: Int16) -> MOPerson? {
            let request: NSFetchRequest<MOPerson> = MOPerson.fetchRequest()
            request.predicate = NSPredicate(format: "\(#keyPath(MOPerson.id)) = %@", NSNumber(int16: id))
            request.fetchLimit = 1
            let result: MOPerson? = (try? CoreDataController.shared.managedContext.fetch(request))?.first
            return result
        }
    }
    

    例子:

    if let person = MOPerson.getPerson(id: 1) {
        print("Person: \(person.firstName), capital: \(person.city?.country?.capital?.name ?? "not defined")")
    }
    

    【讨论】:

    • 非常感谢您提供如此详细的解释!成功了!
    猜你喜欢
    • 1970-01-01
    • 2018-02-11
    • 2019-11-06
    • 2013-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多