如何在Swift中将可变形属性保存到核心数据

问题描述

我正在构建一个SwiftUI应用,该应用可从TMDB获取电影数据。当用户将电影添加到他们的观看列表时,我正在尝试将数据另存为Core Data中的Transformable属性。

问题是我无法保存数据。

这是我的核心数据模型

enter image description here

我为TransformableMovie实体创建了NSManagedObject NSManagedObject子类:

TransformableMovie + CoreDataClass.swift

import Foundation
import CoreData

@objc(TransformableMovie)
public class TransformableMovie: NSManagedObject {

}

TransformableMovie + CoreDataProperties.swift

import Foundation
import CoreData


extension TransformableMovie {

    @nonobjc public class func fetchRequest() -> NSFetchRequest<TransformableMovie> {
        return NSFetchRequest<TransformableMovie>(entityName: "TransformableMovie")
    }

    @NSManaged public var movie: MovieClass?

}

这是我创建的课程:

MovieClass.swift

import Foundation

public class MovieClass: NSObject,NSCoding {
    
    var movie: Movie
    
    init(movie: Movie) {
        self.movie = movie
        
    }
    required public init?(coder aDecoder: NSCoder) {
        self.movie = aDecoder.decodeObject(forKey: "movie") as! Movie

    }
    
    public func encode(with aCoder: NSCoder) {
        aCoder.encode(movie,forKey: "movie")
        
    }
}

这是我试图保存数据的视图(在navigationBarItems按钮中)

MovieDetailView.swift

import SwiftUI
import CoreData

struct MovieDetailView: View {
    
    @ObservedObject private var detailVM = MovieDetailViewModel()
    
    // Core data
    @Environment(\.managedObjectContext) var managedObjectContext
    
    var movie: Movie
    
    @State private var showingAlert = false
    
    init(movie: Movie) {
        self.movie = movie
        detailVM.getMovieDetails(id: movie.id)
        
        // Stop Scrollview bounce
        UIScrollView.appearance().bounces = false
    }
    
    var body: some View {
        
        VStack {
            
            ...

        }.navigationBarTitle(movie.title)
        
        .navigationBarItems(trailing:
                                Button(action: {
                                    
                                    // Save to core data
                                    let movieToBeSaved = TransformableMovie(context: self.managedObjectContext)
                                    
                                    movieToBeSaved.movie?.movie = detailVM.fetchedMovie!
     
                                    self.showingAlert = true
                                    
                                    do {
                                        try self.managedObjectContext.save()
                                    } catch {
                                        // handle the Core Data error
                                    }
                                }) {
                                    Image(systemName: "plus")
                                        .renderingMode(.original)
                                }.alert(isPresented: $showingAlert) {
                                    Alert(title: Text("Saved"),message: Text("Movie added to your watch list"),dismissButton: .default(Text("Ok")))
                                })
        
    }
}

任何帮助将不胜感激。

解决方法

我认为问题在于这一行:

movieToBeSaved.movie?.movie = detailVM.fetchedMovie!

movie?属性为nil,因此分配永远不会起作用。从您提供的代码中很难看出来,但我认为您需要先创建一个ModelClass对象,然后分配该对象:

let movieModel = ModelClass(movie: detailVM.fetchedMovie)
movieToBeSaved.movie = movieModel

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...