我是核心数据的新手。
我想要做的事情:我正在尝试创建一个cocoatouch框架,其中包含一个应用程序,用于添加员工详细信息并在表格视图中显示它们。这样我就可以将这个框架添加到我的主项目中以独立工作。
我面临的问题:框架工作构建没有任何错误。我已经将swift 3的核心数据堆栈添加到了框架中。但是当我运行主项目时,框架加载日志的那一刻显示“无法加载名为Simple framework的模型”,“fetch failed”和“employee必须具有有效的实体描述”。我在框架中使用的代码如下所示:
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)
}
答案 0 :(得分:68)
答案 1 :(得分:24)
明确地将模型文件名传递给Core Data堆栈进行初始化,并确保使用$data[] = [
"ean" => $sku,
"condition" => "100",
"listing_price" => $price,
"minimum_price" => $price,
"amount" => 9,
"delivery_time" => "b",
"location" => "DE"
];
从正确的捆绑包(测试包,app bundle ...)加载它:
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
:
答案 2 :(得分:1)
在我的情况下,由于某种原因,我的项目工作区中缺少DataModel.xcdatamodeld
。
首先,我尝试创建新的DataModle.xcdatamodeld
并重新创建数据模型,但发生了同样的错误。那是我意识到Original DataModel.xcdatamodeld
仍在根目录中的时候。我通过在项目导航器中右键单击我的项目并选择"Add files to "Project"..."
来修复此问题,然后添加了旧数据模型并删除了我的新数据模型。最后,我彻底清理,运行我的项目,它解决了问题。
答案 3 :(得分:1)
您传递给NSPersistentContainer初始化程序的字符串:
NSPersistentContainer(name: "CoreData")
需要匹配您的Xcode项目中数据模型文件的文件名:
CoreData.xcdatamodeld
答案 4 :(得分:0)
我的问题出在我的 .podspec 文件中。您应该在要创建的Pod中包含xcdatamodeld扩展名。
s.resources =“ myprojectfolder / ** / *。{png,jpeg,jpg,storyboard,xib,xcassets,xcdatamodeld}”