удалить человека со всеми назначенными книгами

я работаю с быстрым 4 для osx.

   let appdelegate = NSApplication.shared().delegate as! AppDelegate
    let context = appdelegate.persistentContainer.viewContext
    var people = [Person]()
    let request = NSFetchRequest<Person>(entityName: "Person")
    do {
       people = try context.fetch(request)
       for person in people {
           print("Person: ", person.name!)
           for book in person.books {
                print("Title: ", book.title!)   
           }           
       }
    }

catch { print(error) }
  • у меня есть объекты: Человек и Книги
  • Я могу создать человека
  • я могу создать книгу, которая будет назначена человеку
  • и я знаю, как я могу получить информацию о том, какие книги назначены
    какому человеку (код выше)

теперь я хотел бы удалить человека со всеми назначенными книгами. Могу ли я сделать это за один шаг или мне нужно запросить идентификатор объекта каждой книги из книг сущностей и удалить его? я пробовал что-то вроде этого:

   let appdelegate = NSApplication.shared().delegate as! AppDelegate
    let context = appdelegate.persistentContainer.viewContext
    var people = [Person]()
    let request = NSFetchRequest<Person>(entityName: "Person")


     people = try context.fetch(request)
       for person in people {
           context.delete(person as! NSManagedObject)
           for book in person.books {
                // request object ID of this book form books and delete it
           }           
       }


    } catch { }

person Ghost108    schedule 18.08.2017    source источник


Ответы (1)


Core Data предоставляет «правила удаления отношений» (см. раздел «Правила удаления отношений» в Руководство по программированию CoreData), чтобы управлять тем, что происходит со связанными объектами при удалении объекта.

В вашем случае, если вы установите правило удаления для отношения books объекта Person на «Каскад», Core Data автоматически удалит все связанные объекты Book при удалении объекта Person.

person pbasdf    schedule 18.08.2017