Ios 如何将现有对象保存到核心数据

Ios 如何将现有对象保存到核心数据,ios,swift,core-data,Ios,Swift,Core Data,我一直在做一个项目,我正在使用一个现有的对象。我试图找到一种简单的方法来保存、检索和删除核心数据中这些对象的列表 这是我的目标 import Foundation class Book : Codable { var coverIndex:Int? var authorName:[String]? var title:String? var editionCount:Int? var firstPublishYear:Int? var key:

我一直在做一个项目,我正在使用一个现有的对象。我试图找到一种简单的方法来保存、检索和删除核心数据中这些对象的列表

这是我的目标

import Foundation

class Book : Codable {

    var coverIndex:Int?
    var authorName:[String]?
    var title:String?
    var editionCount:Int?
    var firstPublishYear:Int?
    var key: String?
    var publishPlace:[String]?
    var publisher:[String]?

    public enum BookResponseCodingKeys: String, CodingKey {
        case coverIndex = "cover_i"
        case authorName = "author_name"
        case editionCount = "edition_count"
        case firstPublishYear = "first_publish_year"
        case key = "key"
        case title = "title"
        case publishPlace = "publish_place"
        case publisher = "publisher"
    }

    public required init(from decoder: Decoder) throws {

        let container = try decoder.container(keyedBy: BookResponseCodingKeys.self)

        self.coverIndex = try container.decodeIfPresent(Int.self, forKey: .coverIndex)
        self.authorName = try container.decodeIfPresent([String].self, forKey: .authorName)
        self.editionCount = try container.decodeIfPresent(Int.self, forKey: .editionCount)
        self.firstPublishYear = try container.decodeIfPresent(Int.self, forKey: .firstPublishYear)
        self.key = try container.decodeIfPresent(String.self, forKey: .key)
        self.title = try container.decodeIfPresent(String.self, forKey: .title)
        self.publishPlace = try container.decodeIfPresent([String].self, forKey: .publishPlace)
        self.publisher = try container.decodeIfPresent([String].self, forKey: .publisher)
    }
}

在核心数据中保存此数据(或将其映射到核心数据模型)最简单的方法是什么

添加具有可转换类型的属性。把它命名为“书”

接下来,将可转换属性的类设置为Book数组。在下面的
自定义类
字段中

使用以下代码从当前上下文获取当前数组。这些方法应该放在某种DataManager类中(应该是单例):

然后实现这个函数来创建一个

extension DataManager {
    /// Creates a new user with fresh starting data.
    func createUser() {
        guard let managedContext = getContext() else { return }
        let user = NSManagedObject(entity: userEntity, insertInto: managedContext)
        
        do {
            try managedContext.save()
        } catch let error as NSError {
            print("Failed to save new user! \(error): \(error.userInfo)")
        }
    }
}
现在就打电话:

DataManager.sharedInstance.createUser()

创建一个新用户。 然后,要将书籍附加到用户的存储器中,请执行以下操作:


DataManager.sharedInstance.saveBook(book)

它取决于您希望如何使用对象。您可以从NSManagedObject继承对象,也可以从NSManagedObject建立映射,将对象数据组成类

如果不从NSManagedObject继承对象,可以使用如下代码:

func save(bookObject: Book, in container: NSPersistentContainer) -> NSManagedObject {
        container?.performBackgroundTask { context in
            do {
                // Create NSManagedObject backed object
                let bookEntity = BookEntity(context: context)
                bookEntity.coverIndex = bookObject.coverIndex
                // And all the rest properties

                try context.save()
            } catch (let error) {
                print(error)
                return
            }

        }
    }

谢谢你这么快的回复。我得到了我害怕的错误:属性不能被标记为@NSManaged,因为它的类型不能在这个类的Objective-C中表示:User+CoreDataProperties.swift刚刚注意到了这一点。不要对
Codable
进行子类化,而是尝试对
NSObject
进行子类化,并对
NSCoding
进行子类化。确保实现
encode(使用aCoder:NSCoder)
init?(coder-aDecoder:NSCoder)
方法。NSObject和Codable似乎可以工作。让我试试其余的。酷。我想对于可变会话,您指的是书籍。那么从外部类调用的顺序是什么?呜呜,是的,我做了。首先,只需调用
createUser()
。这只需要运行一次—事实上,您可以通过检查
retrieveUser()
是否返回nil来检查是否尚未创建用户。然后使用
saveBook(book)
方法保存您的书籍。使用这个当前函数,您必须一个接一个地执行此操作,但创建用于追加批处理的函数应该非常简单。
extension DataManager {
    /// Creates a new user with fresh starting data.
    func createUser() {
        guard let managedContext = getContext() else { return }
        let user = NSManagedObject(entity: userEntity, insertInto: managedContext)
        
        do {
            try managedContext.save()
        } catch let error as NSError {
            print("Failed to save new user! \(error): \(error.userInfo)")
        }
    }
}
func save(bookObject: Book, in container: NSPersistentContainer) -> NSManagedObject {
        container?.performBackgroundTask { context in
            do {
                // Create NSManagedObject backed object
                let bookEntity = BookEntity(context: context)
                bookEntity.coverIndex = bookObject.coverIndex
                // And all the rest properties

                try context.save()
            } catch (let error) {
                print(error)
                return
            }

        }
    }