web-dev-qa-db-ja.com

コアデータ:モデルの読み込みに失敗しました

コアデータは初めてです。

私がやろうとしていること:私は従業員の詳細を追加してそれらをテーブルビューに表示するアプリを備えたcocoatouchフレームワークを作成しようとしています。このフレームワークをメインプロジェクトに追加して、独立して動作できるようにします。

私が直面している問題:フレームワークはエラーなしでビルドされます。 Swift 3からのコアデータスタックをフレームワークに追加しました。しかし、メインプロジェクトを実行すると、フレームワークがログをロードする瞬間に「Simple frameworkというモデルのロードに失敗しました」、 「失敗したフェッチ」と「従業員には有効なエンティティの説明が必要です。」フレームワークで使用したコードは次のとおりです。

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.

23
Ashiq Sulaiman

モデル名が間違っていたときにこの問題が発生しました-プロジェクトではなくモデル名を使用する必要があります(スクリーンショットを参照) enter image description here

72

初期化のためにモデルファイル名をコアデータスタックに明示的に渡し、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)

//...

編集:

また、SimpleFramework.xcdatamodeldは使用済みターゲットに追加されますTarget Membership

30
shallowThought

私の場合、何らかの理由でDataModel.xcdatamodeldがプロジェクトワークスペースにありません。

最初に新しいDataModle.xcdatamodeldを作成してデータモデルを再作成しようとしましたが、同じエラーが発生しました。 Original DataModel.xcdatamodeldがまだルートディレクトリにあることに気づいたときです。これを修正するには、プロジェクトナビゲーターでプロジェクトを右クリックし、"Add files to "Project"..."を選択してから、古いデータモデルを追加し、新しいデータモデルを削除しました。最後に、ハードクリーニングを行い、プロジェクトを実行し、問題を修正しました。

1
Alec Michel

NSPersistentContainerイニシャライザーに渡す文字列:

NSPersistentContainer(name: "CoreData")

match Xcodeプロジェクトのデータモデルファイルのファイル名が必要です。

CoreData.xcdatamodeld
1
pkamb