Я придумал следующую схему БД:
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")")
}