从核心数据获取SQL类型的请求

时间:2018-09-23 14:05:01

标签: ios swift database fetch predicate

尽管有与此类似的主题,但是在堆栈溢出中,没有明确的问题答案,我将在下面进行描述。为简单起见,我将简化实体。因此:核心数据中有两个实体:

第一个名为 Person 的实体,具有以下属性:

姓氏
城市

第二实体:国家/地区,属性:
城市
资本

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

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

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

类似于此问题,但那里没有明确的答案:Selecting columns from different entities

1 个答案:

答案 0 :(得分: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

Xcode screenshot

一旦您需要一些人的信息并且您知道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")")
}