Базовые данные не добавляют пользовательский объект в другой - PullRequest
0 голосов
/ 29 апреля 2020

Я пытаюсь реализовать простое добавление одной сущности к другой в Базовых данных, но он этого не делает и не может найти то, что должно быть реализовано. Первый объект имеет атрибут, который является массивом второго объекта. Когда я пытаюсь заполнить основные данные, добавление не происходит. Я хочу заполнить первую сущность, и вторая тоже внутри. Я пробовал отношения, но поскольку атрибут Transformable, он не имеет смысла для меня и не работает. Я тоже пробовал вручную, безуспешно. Когда я нажимаю кнопку «Книги», атрибут равен нулю, а кнопка «Информация» сообщает мне данные: ошибка.

First entity Second entity

import SwiftUI
import CoreData

struct Books {
    var id: String
    var information: [Information]

    init(id: String, information: [Information]) {
        self.id = id
        self.information = information
    }
}

struct Information {
    var id: String
    var preview: String

    init(id: String, preview: String) {
        self.id = id
        self.preview = preview
    }
}

let db: [Books] = [
    Books(id: "Book title 1", information: [
        Information(id: "ABC", preview: "Some first preview"),
        Information(id: "abc", preview: "lesser preview to first preview")]),
    Books(id: "Book title 2", information: [Information(id: "DEF", preview: "Some second preview")]),
    Books(id: "Book title 3", information: [
        Information(id: "GHI", preview: "Some third preview"),
        Information(id: "ghi", preview: "random third preview"),
        Information(id: "123", preview: "bla bla bla"),
        Information(id: "123", preview: "Some very long preview - Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. ")
    ])
]

class CDDatabase {

    static let shared = CDDatabase()

    func saveLocally(list: [Books]) {

    guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {return}

    let container = appDelegate.persistentContainer

    container.performBackgroundTask { (context) in

        for book in db {
            let newLocalBook = CD_Book(context: context)

            newLocalBook.id = book.id

            for info in book.information {
                let newInfo = CD_Information(context: context)

                newInfo.id = info.id
                newInfo.preview = info.preview

                print("Before appending we have: \(newInfo)")

                newLocalBook.information?.append(newInfo)
            }

            print(newLocalBook.information ?? "Nothing appended")


        }

        do {
            try context.save()
        } catch {
            print(error.localizedDescription)
        }
    }

    }
}

struct ContentView: View {
    @FetchRequest(
        entity: CD_Book.entity(),
        sortDescriptors: []
    ) var books: FetchedResults<CD_Book>

    @FetchRequest(
        entity: CD_Information.entity(),
        sortDescriptors: []
    ) var information: FetchedResults<CD_Information>

    var body: some View {
        VStack {
            VStack(alignment: .center, spacing: 50) {
                Button("Print books") {
                    print(self.books)
                }
                Button("Print information") {
                    print(self.information)
                }
            }
            ForEach(self.books, id: \.id) { book in
                Section(header: Text(book.id ?? "No book id")) {
                    ForEach(book.information ?? [], id: \.id) { info in
                        Text("ID: \(info.id ?? "No id fetched"), PREVIEW: \(info.preview ?? "No preview fetched")")
                    }
                }
            }
        }

    }
}

А в Appdelegate, в didFini sh с опциями я называю это:

private func preloadData() {
        CDDatabase.shared.saveLocally(list: db)
    }

При запуске консоль говорит мне, что ничего не добавлено. Заранее спасибо!

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