I have two entities
@objc(Movies)
public class Movies: NSManagedObject {
}
extension Movies {
@nonobjc public class func fetchRequest() -> NSFetchRequest<Movies> {
return NSFetchRequest<Movies>(entityName: "Movies")
}
@NSManaged public var id: Int64
@NSManaged public var isFav: Bool
@NSManaged public var overview: String?
@NSManaged public var poster: String?
@NSManaged public var release_date: String?
@NSManaged public var title: String?
@NSManaged public var genresID: NSSet?
}
// MARK: Generated accessors for genresID
extension Movies {
@objc(addGenresIDObject:)
@NSManaged public func addToGenresID(_ value: GenresID)
@objc(removeGenresIDObject:)
@NSManaged public func removeFromGenresID(_ value: GenresID)
@objc(addGenresID:)
@NSManaged public func addToGenresID(_ values: NSSet)
@objc(removeGenresID:)
@NSManaged public func removeFromGenresID(_ values: NSSet)
}
@objc(GenresID)
public class GenresID: NSManagedObject {
}
extension GenresID {
@nonobjc public class func fetchRequest() -> NSFetchRequest<GenresID> {
return NSFetchRequest<GenresID>(entityName: "GenresID")
}
@NSManaged public var id: Int64
@NSManaged public var name: String?
@NSManaged public var movieID: Movies?
}
When I click a button an action is triggered to save a movie, and then I would like to save that movie that has been "favored". A movie can have multiples genres (one-to-many relationship).
Method action:
func saveMoviesDB (movie: Movie) {
guard let appDelegate =
UIApplication.shared.delegate as? AppDelegate else {
return
}
let managedContext = appDelegate.persistentContainer.viewContext
let entityMovie = NSEntityDescription.entity(forEntityName: "Movies", in: managedContext)!
let entityGenres = NSEntityDescription.entity(forEntityName: "GenresID", in: managedContext)!
let movieDB = NSManagedObject(entity: entityMovie, insertInto: managedContext)
let genresDB = NSManagedObject(entity: entityGenres, insertInto: managedContext)
movieDB.setValue(movie.id, forKey: "id")
movieDB.setValue(movie.title, forKey: "title")
movieDB.setValue(movie.isFav, forKey: "isFav")
movieDB.setValue(movie.poster, forKey: "poster")
movieDB.setValue(movie.overview, forKey: "overview")
movieDB.setValue(movie.releaseDate, forKey: "release_date")
do{
try managedContext.save()
moviesDB.append(movieDB)
} catch let error as NSError {
print("Could not save. \(error), \(error.userInfo)")
}
}
I don't know how to assign multiple genresID to the Movie. For each movie, there is an Int array containing the Ids of the genres.
EDIT: I decided to remove the genre entity and create a transformable type property in Movies to store the arrays of Int. It went like this:
extension Movies {
@nonobjc public class func fetchRequest() -> NSFetchRequest<Movies> {
return NSFetchRequest<Movies>(entityName: "Movies")
}
@NSManaged public var id: Int64
@NSManaged public var isFav: Bool
@NSManaged public var overview: String?
@NSManaged public var poster: String?
@NSManaged public var release_date: String?
@NSManaged public var title: String?
@NSManaged public var genresID: [NSNumber]?
}
And then I cast it before saving it to the database
let genresID = movie.genre as [NSNumber]