SwiftUI @FetchRequest завершает работу приложения и возвращает ошибку - PullRequest
0 голосов
/ 23 февраля 2020

Я пытаюсь использовать базовые данные в своем приложении ma c с SwiftUI с использованием Xcode 11. Я проверял «Использование базовых данных» при создании проекта. Я также создал сущность (называемую VisitedCases) и использовал редактор для создания файлов подкласса NSManagedObject. Я также установил для Codegen значение Manual / none. Вот код в сгенерированных файлах NSManagedObject:

VisitedCases + CoreDataProperties.swift

extension VisitedCases {

    @nonobjc public class func fetchRequest() -> NSFetchRequest<VisitedCases> {
        return NSFetchRequest<VisitedCases>(entityName: "VisitedCases")
    }

    @NSManaged public var caseNumber: String

} 

VisitedCases + CoreDataClass.swift

@objc(VisitedCases)
public class VisitedCases: NSManagedObject {

}

Я вызвал переменную @Environment и @FetchRequest в ContentView.swift как:

struct ContentView: View {
    @Environment(\.managedObjectContext) var managedObjectContext

    @FetchRequest(entity: VisitedCases.entity(),
                  sortDescriptors: []
                  ) var orders: FetchedResults<VisitedCases>
//@State vars and the rest of the code
}

Однако, когда я запустился, приложение упало сразу после запуска со следующими ошибками в выводе:

2020-02-23 18:36:16.889306+0330 ImageSelector[17874:149503] [error] error: No NSEntityDescriptions in any model claim the NSManagedObject subclass 'VisitedCases' so +entity is confused.  Have you loaded your NSManagedObjectModel yet ?
CoreData: error: No NSEntityDescriptions in any model claim the NSManagedObject subclass 'VisitedCases' so +entity is confused.  Have you loaded your NSManagedObjectModel yet ?
2020-02-23 18:36:16.889389+0330 ImageSelector[17874:149503] [error] error: +[VisitedCases entity] Failed to find a unique match for an NSEntityDescription to a managed object subclass
CoreData: error: +[VisitedCases entity] Failed to find a unique match for an NSEntityDescription to a managed object subclass
2020-02-23 18:36:16.921131+0330 ImageSelector[17874:149503] executeFetchRequest:error: A fetch request must have an entity.

У меня также есть функция, которая сохраняет строку в хранилище и, кажется, работает нормально:

    func addCaseNumber (caseNo: String) {
        guard caseNo != "" else {return}
        let newCaseNumber = VisitedCases(context: self.managedObjectContext)
        newCaseNumber.caseNumber = caseNo
        do {
         try self.managedObjectContext.save()
         print("Case number saved.")
        } catch {
         print(error.localizedDescription)
         }
    }

Что не так с моим кодом и что мне сделать, чтобы это исправить?

Ответы [ 2 ]

0 голосов
/ 23 февраля 2020

Иногда в @enviromentVAr вам необходимо установить среду самостоятельно.

 let managedObjectContext: NSManagedObjectContext =  ((UIApplication.shared.delegate as? AppDelegate)?.persistentContainer.viewContext)!

 ContentView().environment(\.managedObjectContext, managedObjectContext)

Тогда с помощью управляемогоObjectContext может работать.

 @Environment(\.managedObjectContext) var managedObjectContext
0 голосов
/ 23 февраля 2020

Попробуйте назначить managedObjectContext в вашем ContentView следующим образом

let managedObjectContext: NSManagedObjectContext =  ((UIApplication.shared.delegate as? AppDelegate)?.persistentContainer.viewContext)!

Если это работает, это означает, что ваш @Environment var не работает.

Чтобы узнать, где разрыв происходит, начиная с SceneDelegate, имеющего

let contentView = ContentView().environment(\.managedObjectContext, context)

Затем посмотрите, где разрывается соединение с Environment

Добавьте что-то подобное во все ваши представления, чтобы увидеть, что не t * получить переменную Environment.

@Environment(\.managedObjectContext) var managedObjectContext
     var body: some View {
         print("MOC = ")
         print(managedObjectContext.name ?? "broken")
     return Text("Hello World!")
}

Когда вы найдете разрыв, восстановите sh с помощью

YourBrokenView().environment(\.managedObjectContext, managedObjectContext)
...