Базовые данные не загружаются без значения для необязательного атрибута отношения?!? стриж - PullRequest
0 голосов
/ 17 июня 2019

Я новичок в Базовые данные , и, хотя это медленно приобретает смысл, у меня проблема с загрузкой моей исходной базы данных , когда я оставляю 'необязательные' отношения значения без значений (разве это не то, что делают дополнительные функции?).Следующий код работает, но не в том случае, если я пропускаю некоторые случаи, когда создаются экземпляры и определяются отношения (точные детали приведены ниже).

Я использую класс для загрузки данных через цикл for, который присваивает инициализирующие значенияи передает их в метод, который эффективно загружает данные.Во-первых, для загрузки сущности с именем Gender.

class LoadData
{
init ()
{
    for count in 0...3
    {
        var text = "Value not found"
        let sortOrder: Int32 = Int32(count)

        switch count
        {
        case 0:
            text = "Masculine"
        case 1:
            text = "Neutral"
        case 2:
            text = "Feminine"
        case 3:
            text = "Plural"
        default:
            text = "Value unassigned"
        }
        loadGender(text: text, sortOrder: sortOrder)
    }

В том же классе и init отдельный цикл for определяет значения и передает значения для сохранения контекста в Entity, CellData .Для записей CellData, определенных в случаях от 0 до 27 и от 28 до 51 , я использую предикат для создания конкретной записи Gender ...

    for count in 0...51
    {
        var text = "Cell text not found"
        ...
        var dataToGender: Gender? = nil


        switch count
        {
        case 0...27:     // HERE - if case 1...27, data will NOT load

            guard let appDelegate = UIApplication.shared.delegate as? AppDelegate
                else { return }
            let moc = appDelegate.persistentContainer.viewContext
            let request = NSFetchRequest<Gender>(entityName: "Gender")

            let genderToFetch = "Masculine"
            request.predicate = NSPredicate(format: "text == %@", genderToFetch)

            do
            {
                let fetched = try moc.fetch(request)
                dataToGender = fetched[0] as Gender
            } catch
            { fatalError("Failed to fetch employees: \(error)") }

        case 28...51:
            guard let appDelegate = UIApplication.shared.delegate as? AppDelegate
                else { return }     // get the app delegate
            let moc = appDelegate.persistentContainer.viewContext
            let request = NSFetchRequest<Gender>(entityName: "Gender")

            let genderToFetch = "Feminine"
            request.predicate = NSPredicate(format: "text == %@", genderToFetch)

            do
            {
                let fetched = try moc.fetch(request)
                dataToGender = fetched[0] as Gender
            } catch
            { fatalError("Failed to fetch employees: \(error)") }

        default: return
        }

        ...

..., которая передается вметод, чтобы поместить данные в контекст и сохранить их в Core Data.

func loadCellData(text: String, sortOrder: Int32, portion: Float, color1: String?, color2: String?, color3: String?, colorRangeLoc1: Int32?, colorRangeLoc2: Int32?, colorRangeLoc3: Int32?, colorRangeLen1: Int32?, colorRangeLen2: Int32?, colorRangeLen3: Int32?, underlineRangeLoc1: Int32?, underlineRangeLoc2: Int32?, underlineRangeLoc3: Int32?, underlineRangeLen1: Int32?, underlineRangeLen2: Int32?, underlineRangeLen3: Int32?, dataToGender: NSObject?)
{
    let appDelegate = UIApplication.shared.delegate as! AppDelegate
    let context = appDelegate.persistentContainer.viewContext

    let entry: CellData = NSEntityDescription.insertNewObject(forEntityName: "CellData", into: context) as! CellData
    ...
    entry.text = text
    ...
    entry.dataToGender = dataToGender as? Gender

    do { try context.save() ; print("saved")}
    catch let error as NSError
    { print("Could not save. \(error), \(error.userInfo)") }
}

Удивительно, но это прекрасно работает, но только если я определю отношение для всех записей CellData.Однако я не хочу, чтобы все записи имели отношение (см. Комментарий // ЗДЕСЬ).Случаи 0 ... 7 не должны иметь отношения, но если значение не назначено, код выполняется нормально - до вызова значения БД.При проверке Gender вводится нормально, но в Cell не вводятся записи CellData, поэтому происходит сбой, при этом объект не найден в разделе 0 индекса 0.

В журнале нет ошибок;и я могу напечатать внутри loadCellData!?!Что происходит?!?

...