Запрос на выборку типа SQL из основных данных - PullRequest
0 голосов
/ 23 сентября 2018

Хотя есть похожие темы, но при переполнении стека нет четкого ответа на вопрос, который я опишу ниже.Для простоты я упрощу сущности.Итак: в основных данных есть две сущности:

Первая сущность с именем Персона с атрибутами:
Имя
Фамилия
Город

Второй объект: Страна с атрибутами:
Город
Столица

Идея состоит в том, что в одном контроллере представления пользователь добавляет значения в форме для второго объекта - заполняетинформация о городе и столице страны.В другом контроллере представления пользователь заполняет имя и фамилию, но выбирает город в представлении выбора, который уже заполнен данными, добавленными в другой контроллер представления.

В контроллере третьего представления я хочу получить первый объект, добавив к нему капитал (вся информация в контроллере табличного представления), например, если первый объект содержит данные:
John |Джонс |Чикаго
второй по умолчанию должен иметь строку с этими данными:
Чикаго |Вашингтон

Как мне назначить «Вашингтон» для «Джона»?

Похоже на эту проблему, но нет однозначного ответа: Выбор столбцов из разных сущностей

1 Ответ

0 голосов
/ 23 сентября 2018

Я придумал следующую схему БД:

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")")
}
...