Как сохранить массив пользовательских объектов одновременно в базовом хранилище данных в Swift - PullRequest
0 голосов
/ 09 января 2020

У меня очень похожий вопрос к: Swift: Хранить массивы пользовательских классов в Core Data

Разница в том, что этот вопрос пытался добавить в массив пользовательских классов в Core Data один элемент за один раз. Я ищу, чтобы добавить весь массив сразу. Когда я пытаюсь это сделать, я получаю следующую ошибку: [CDTester.MassOfSubpart entity]: нераспознанный селектор отправлен в экземпляр.

Я сделал простое приложение, чтобы продемонстрировать ошибку и, надеюсь, выяснить, где я иду не так. Я загрузил его на GitHub здесь: https://github.com/Yrban/Core-Data-Test-App

Код, где происходит сбой, находится здесь:

func saveWidget(){
    print("saveWidget() entered")
    if self.massOfSubpartMeasurementDict.count > 0,
        self.massOfSubpartMeasurementDict.count == self.numberOfSubparts,
        self.manufacturer != "",
        self.title != "" {

        var massPerSubpartMeasurementArray: [MassOfSubpart]
        massPerSubpartMeasurementArray = massOfSubpartMeasurementDict.map {
            return MassOfSubpart(subpart: $0.key, mass: Measurement(value: Double($0.value)!, unit: self.massUnit))
        }
        let massOfSubpartSet = Set(massPerSubpartMeasurementArray)

        let widget = Widget(context: self.managedObjectContext)
        widget.id = UUID()
        widget.madeBy?.name = self.manufacturer
        widget.hasMassOfPart = massOfSubpartSet // FIXME: The crash is here
        widget.title = self.title

        do {
            print("SaveWidget() attempted/n")
            try self.managedObjectContext.save()
        } catch {
            print("SaveWidget() failed/n")
            // handle the Core Data error
            // Show alert as to status
        }
    }
}

Моя базовая модель данных:

Core Data Model

MassOfSubpart - это пользовательский объект:

import SwiftUI

public class MassOfSubpart: NSObject, Codable {

    var subPart: Int
    var mass: Measurement<UnitMass>

    override init() {
        self.subPart = 1
        self.mass = Measurement(value: 0.0, unit: UnitMass.grams)
    }

    init(subpart: Int, mass: Measurement<UnitMass>){
        self.subPart = subpart
        self.mass = mass
    }
}

Я прочитал все, что смог найти, включая документацию Apple. Я чувствую, что я рядом, но я, очевидно, упускаю что-то важное. Любая помощь будет оценена.

1 Ответ

0 голосов
/ 10 января 2020

Я наконец понял свою ошибку. Раньше я не пользовалась отношениями, поэтому мне не дошло, что я делаю. Когда я обращался к MassOfPartEntity через его связь с Widget, я отправлял Set, мой пользовательский объект через. Тем не менее, я должен был отправить Set, фактическую сущность через. Поэтому я изменил saveWidget на следующее:

func saveWidget(){
    print("saveWidget() entered")
    if self.massOfSubpartMeasurementDict.count > 0,
        self.massOfSubpartMeasurementDict.count == self.numberOfSubparts,
        self.manufacturer != "",
        self.title != "" {

        let massOfPartEntity = MassOfPartEntity(context: self.managedObjectContext)
        var massPerSubpartEntityArray: [MassOfPartEntity]
        massPerSubpartEntityArray = massOfSubpartMeasurementDict.map {
            massOfPartEntity.subPart = Int16($0.key)
            if let massDouble = Double($0.value) {
                massOfPartEntity.mass = Measurement(value: massDouble, unit: massUnit)
            } else {
                massOfPartEntity.mass = Measurement(value: 0.0, unit: massUnit)
            }
            return massOfPartEntity
        }
        let massOfSubpartSet = Set(massPerSubpartEntityArray) as NSSet

        let widget = Widget(context: self.managedObjectContext)
        widget.id = UUID()
        widget.madeBy?.name = self.manufacturer
        widget.addToHasMassOfPart(massOfSubpartSet) // FIXME: The crash is here
        widget.title = self.title

        do {
            print("SaveWidget() attempted/n")
            try self.managedObjectContext.save()
        } catch {
            print("SaveWidget() failed/n")
            // handle the Core Data error
            // Show alert as to status
        }
    }
}

, изменив возвращаемую функцию Map так, чтобы она возвращала MassOfPartEntity's, который в итоге стал Set. По сути, это было несоответствие типов.

Спасибо тем, кто ответил на это, определенно помог решить эту проблему.

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