Как добавить запись в основной объект данных, имеющий отношение один ко многим - PullRequest
0 голосов
/ 09 ноября 2018

У меня есть две сущности Mobile и User, в которых Mobile имеет атрибут name, а user также имеет атрибут name. Пользователь может иметь несколько мобильных телефонов, но мобильный может иметь только один пользователь. Сценарий заключается в том, что когда бы я ни вводил имя для пользователя, которое уже присутствует в сущности «Пользователь», он должен обновлять этот набор user.mobile, а не дублировать нового пользователя. Это мои функции сохранения и выборки

    func save () {
    if context.hasChanges {
        do {
            try context.save()
            print("saved succesfully")
        } catch {
            let nserror = error as NSError
            fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
        }
    }
}

func fetch<T: NSManagedObject>( _ objectType: T.Type) -> [T] {
    let  entityName = String(describing: objectType)
    let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: entityName)

    do {
        let fetchedObjects = try context.fetch(fetchRequest) as? [T]
        return fetchedObjects ?? [T]()
    } catch {
        print(error)
        return [T]()
    }
}

Вот как я добавляю

       users = persistenceManager.fetch(User.self)
    if users.count > 1 {
    for val in users {

        if val.name == "Umar" {
            val.addToDevice(device)
            device.user = val
            persistenceManager.save()
        }
        else if val.name != nil  {
                            user.name = "Umar"
                            user.addToDevice(device)
            device.user = user
            persistenceManager.save()
        }
    }

1 Ответ

0 голосов
/ 09 ноября 2018

В вашем вопросе отсутствуют некоторые детали. Но позвольте мне предположить, что я вас правильно понимаю.

    let userName = "some name from user input"
    let user = MOUser.getUser(context, name: userName, createIfMissing: true)
    // here you have user with name required and not duplicated if already exists
device.user = user

И добавить статическую функцию либо в свой класс пользователя, либо в координатор БД.

    static func getUser(moc: NSMaagedObjectContext, name: String, createIfMissing: Bool) -> MOUser? {
        let request: NSFetchRequest<MOUser> = MOUser.fetchRequest()
        request.predicate = NSPredicate(format: "\(#keyPath(MOUser.name)) = %@", name)
        request.fetchLimit = 1
        var result: MOUser? = (try? moc.fetch(request))?.first

        if result == nil && createIfMissing {
            result = MOUser(context: moc)
            result?.name = name
        }
        return result
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...