Как сохранить существующие объекты в Core Data - PullRequest
0 голосов
/ 05 июня 2019

Я работал над проектом, и у меня уже есть существующий объект.Я пытаюсь найти простой способ сохранить, извлечь и удалить список этих объектов в Базовых данных.

Вот мой объект

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)
    }
}

Что наиболее просто сохранить этов базовых данных (или для сопоставления с моделью базовых данных)

Ответы [ 2 ]

2 голосов
/ 05 июня 2019

В вашем xcdatamodeld определите сущность, например User:

enter image description here

Добавить атрибут с трансформируемым типом. Назовите это «книги».

enter image description here

Затем установите класс атрибута Transformable в массив Book. В поле Custom Class ниже.

enter image description here

Используйте следующий код, чтобы получить текущий массив из текущего контекста. Эти методы должны входить в некоторый класс DataManager (который должен быть одноэлементным):

import CoreData

open class DataManager: NSObject {

    public static let sharedInstance = DataManager()

    private override init() {}

    // Helper func for getting the current context.
    private func getContext() -> NSManagedObjectContext? {
        guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return nil }
        return appDelegate.persistentContainer.viewContext
    }

    func retrieveUser() -> NSManagedObject? {
        guard let managedContext = getContext() else { return nil }
        let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "User")

        do {
            let result = try managedContext.fetch(fetchRequest) as! [NSManagedObject]
            if result.count > 0 {
                // Assuming there will only ever be one User in the app.
                return result[0]
            } else {
                return nil
            }
        } catch let error as NSError {
            print("Retrieiving user failed. \(error): \(error.userInfo)")
           return nil
        }
    }

    func saveBook(_ book: Book) {
        print(NSStringFromClass(type(of: book)))
        guard let managedContext = getContext() else { return }
        guard let user = retrieveUser() else { return }

        var books: [Book] = []
        if let pastBooks = user.value(forKey: "books") as? [Book] {
            books += pastBooks
        }
        books.append(book)
        user.setValue(books, forKey: "books")

        do {
            print("Saving session...")
            try managedContext.save()
        } catch let error as NSError {
            print("Failed to save session data! \(error): \(error.userInfo)")
        }
    }

}

Вам также понадобится метод для создания пользователя (и, вероятно, удаления, при условии, что мы хотим следовать CRUD). Во-первых, вам нужно получить ссылку на пользовательскую сущность, чтобы создать ее. Это определение должно быть в верхней части вашего класса DataManager.

extension DataManager {
    private lazy var userEntity: NSEntityDescription = {
        let managedContext = getContext()
        return NSEntityDescription.entity(forEntityName: "User", in: managedContext!)!
    }()
}

А затем реализуйте эту функцию, чтобы создать ее.

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)

0 голосов
/ 05 июня 2019

Это зависит от того, как вы хотите работать с вашим объектом.Вы можете унаследовать свой объект от 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
            }

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