Как удалить ссылку в отношении многие ко многим в Swift Core Data - PullRequest
0 голосов
/ 27 марта 2020

В настоящее время я работаю над небольшим проектом, в котором я изучаю разработку для IOS. Но я наткнулся на проблему, которая не может показаться мне безразличной. Я занимаюсь разработкой приложения в Swift, которое может хранить фильмы и списки просмотра. Используя базовые данные, я установил связь между многими из них, чтобы иметь возможность добавлять фильмы в один или несколько списков наблюдения и наоборот.

Diagram of the relationship between two objects in Core Data Data Model

У меня проблема с удалением этих ссылок. Если отношения установлены, я не могу найти способ «отключить» определенный mov ie и список наблюдения. Сценарий:

  1. При создании экземпляра моей модели просмотра я выбираю mov ie, который в данный момент выбран следующим образом:

    func getMovie(with title: String) {
    guard let context = self.managedContext else {
        assertionFailure("Context not available")
        return
    }
    let predicate = NSPredicate(format: "title == %@", title)
    
    let fetchRequest = NSFetchRequest<NSFetchRequestResult>.init(entityName: "WLMovie")
    fetchRequest.fetchLimit = 1
    fetchRequest.predicate = predicate
    
    do {
        let result = try context.fetch(fetchRequest)
        for movie in result {
            self.wlMovie = movie as? WLMovie
        }
    } catch let error as NSError {
        print("Could not retreive movie. \(error)")
    }
    

    }

  2. После этого, если есть связь, я хочу удалить ее и делаю это так (! Мне нужны защитные операторы, потому что я сохраняю переменные как необязательные):

    func removeFromWatchList(at index: Int) {
    guard let context = self.managedContext else {
        assertionFailure()
        return
    }
    guard let movieToRemove = self.wlMovie,
        let watchListToRemoveFrom = self.watchLists?[index] else { return }
    do {
        self.watchLists?[index].removeFromMovies(movieToRemove)
        self.wlMovie?.removeFromWatchlists(watchListToRemoveFrom)
        try context.save()
    } catch let error as NSError {
        print("Could not save. \(error), \(error.userInfo)")
    }
    }
    

    Переменные класса:

    private(set) var watchLists: [Watchlist]?
    private var wlMovie: WLMovie?
    

После удаления ссылки она все еще будет существовать, но не выдаст ошибку. Документация по отношениям «многие ко многим» в Core Data очень скудна, поэтому я надеюсь, что кто-то скажет мне, что я делаю здесь неправильно. Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...