コアデータは初めてです。
私がやろうとしていること:私は従業員の詳細を追加してそれらをテーブルビューに表示するアプリを備えた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)
}
初期化のためにモデルファイル名をコアデータスタックに明示的に渡し、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
:
私の場合、何らかの理由でDataModel.xcdatamodeld
がプロジェクトワークスペースにありません。
最初に新しいDataModle.xcdatamodeld
を作成してデータモデルを再作成しようとしましたが、同じエラーが発生しました。 Original DataModel.xcdatamodeld
がまだルートディレクトリにあることに気づいたときです。これを修正するには、プロジェクトナビゲーターでプロジェクトを右クリックし、"Add files to "Project"..."
を選択してから、古いデータモデルを追加し、新しいデータモデルを削除しました。最後に、ハードクリーニングを行い、プロジェクトを実行し、問題を修正しました。
NSPersistentContainerイニシャライザーに渡す文字列:
NSPersistentContainer(name: "CoreData")
match Xcodeプロジェクトのデータモデルファイルのファイル名が必要です。
CoreData.xcdatamodeld