2017-03-02 14 views
15

Jestem nowy w danych podstawowych.Dane podstawowe: Nie można załadować modelu

Co próbuję zrobić: Próbuję stworzyć strukturę cocoatouch, która ma aplikację, aby dodać szczegóły pracownika i wyświetlić je w widoku tabeli. Tak, że mogę dodać tę strukturę do mojego głównego projektu, aby pracować niezależnie.

Problemy, które napotykam: Konstrukcja ramki jest tworzona bez żadnego błędu. Dodałem podstawowy stos danych z Swift 3 do frameworka. Ale kiedy uruchamiam główny projekt, w momencie załadowania rejestru przez raport "Nie można załadować modelu o nazwie Prosta struktura", "pobieranie nie powiodło się" i "pracownik musi mieć poprawny opis jednostki". Kod, który użyłem w ramach jest tak jak pokazano poniżej:

public class CoreDataStack { 
    public static let sharedInstance = CoreDataStack() 

     lazy var persistentContainer: NSPersistentContainer = { 
     let container = NSPersistentContainer(name: "SimpleFramework") 
     container.loadPersistentStores(completionHandler: { (storeDescription, error) in 
      if let error = error { 
       fatalError("Unresolved error \(error), \(error)") 
      } 
     }) 
     return container 
    }() 

public func saveContext() { 
     let context = persistentContainer.viewContext 
     if context.hasChanges { 
      do { 
       try context.save() 
      } catch let error as NSError { 
       fatalError("Unresolved error \(error), \(error.userInfo)") 
      } 
     } 
    } 
} 





@IBAction func addEmployee(_ sender: Any) { 

    //To save the data 
    let context = CoreDataStack.sharedInstance.persistentContainer.viewContext 
    let employee = Employee(context: context) 
    employee.employeeName = nameTextField.text 
    employee.employeeAge = Int16(ageTextField.text!)! 
    employee.hasVehicle = hasVehicle.isOn 
    CoreDataStack.sharedInstance.saveContext() 
    navigationController!.popViewController(animated: true) 

} 


@IBAction func addEmployee(_ sender: Any) { 

    //To save the data 
    let context = CoreDataStack.sharedInstance.persistentContainer.viewContext 
    let employee = Employee(context: context) 
    employee.employeeName = nameTextField.text 
    employee.employeeAge = Int16(ageTextField.text!)! 
    employee.hasVehicle = hasVehicle.isOn 
    CoreDataStack.sharedInstance.saveContext() 
    navigationController!.popViewController(animated: true) 

} 

This is a screenshot of the console log.

+1

Pierwszy błąd mówi, że plik modelu 'SimpleFramework.momd' jest niedostępny lub znajduje się poza zakresem. – vadian

+1

Czy rozwiązałeś ten problem? Mam ten sam błąd i nie mam pojęcia, jak go rozwiązać. – Blehi

+1

Szukając odpowiedzi, naprawiłeś to? – KostiaZzz

Odpowiedz

7

Jawnie przekazać plik modele nazwisko do podstawowych danych stosu dla inicjowania i upewnij się, że jest ładowany z prawej wiązki w czasie (wiązki testy, aplikacja wiązki ...) przy użyciu Bundle(for: type(of: self)):

//... 
let momdName = "SimpleFramework" //pass this as a parameter 
//... 

guard let modelURL = Bundle(for: type(of: self)).url(forResource: momdName, withExtension:"momd") else { 
     fatalError("Error loading model from bundle") 
} 

guard let mom = NSManagedObjectModel(contentsOf: modelURL) else { 
    fatalError("Error initializing mom from: \(modelURL)") 
} 

persistentContainer = NSPersistentContainer(name: momdName, managedObjectModel: mom) 

//... 

Edit:

Również upewnić się, SimpleFramework.xcdatamodeld jest dodany do kategorii celów Target Membership:

+0

To nie działa. Dostaję błąd we wszystkich komunikatach straży. Próbowałem przepisać kod, ale wyrzucił "kolejne instrukcje na linii muszą być oddzielone;". –

+0

Zobacz zaktualizowaną odpowiedź. – shallowThought

+0

Tak, podwójnie to sprawdziłem. –

34

miałem ten problem, kiedy miałem złą nazwę modelu - to powinno mi modele nazwy, a nie projektów (zobacz zrzut ekranu) enter image description here

+2

Nazwa mojego projektu i nazwa xcdatamodeld są takie same w mojej aplikacji. –

+0

W moim przypadku nazwy były różne. Ustawienie tej samej nazwy w całym miejscu rozwiązało problem. Nie mogę głosować tak wiele razy, jak na to zasługuje (zdjęcie z zieloną strzałką jest bezcenne). –

+2

Te dwie są dla mnie takie same i nadal nie działały. – horseshoe7

0

W moim przypadku, z jakiegoś powodu DataModel.xcdatamodeld zniknął z mojego obszaru roboczego projektu.

Najpierw próbowałem utworzyć nowy DataModle.xcdatamodeld i ponownie utworzyć model danych, ale wystąpił ten sam błąd. Było tak, gdy zdałem sobie sprawę, że Original DataModel.xcdatamodeld nadal znajduje się w katalogu głównym. Naprawiłem to, klikając prawym przyciskiem myszy mój projekt w nawigatorze projektu i wybierając "Add files to "Project"...", a następnie dodałem mój stary model danych i usunąłem mój nowy model danych. W końcu mocno wyczyściłem, uruchomiłem projekt i naprawiłem problem.

Powiązane problemy