Ash*_*man 23 core-data swift swift3
我是核心数据的新手.
我想做的是:我正在尝试创建一个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)
}
Run Code Online (Sandbox Code Playgroud)
小智 79
我有这个问题,当我的模型名称错误时 - 它应该是模型名称,而不是项目(参见屏幕截图)
sha*_*ght 34
将模型文件名显式传递给Core Data堆栈进行初始化,并确保通过使用Bundle(for: type(of: self))
以下方式从正确的bundle(测试包,app bundle ...)加载它:
//...
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)
//...
Run Code Online (Sandbox Code Playgroud)
编辑:
还要确保将SimpleFramework.xcdatamodeld
已添加到已使用的目标中Target Membership
:
您传递给NSPersistentContainer初始化程序的字符串:
NSPersistentContainer(name: "CoreData")
Run Code Online (Sandbox Code Playgroud)
需要与 Xcode项目中数据模型文件的文件名匹配:
CoreData.xcdatamodeld
Run Code Online (Sandbox Code Playgroud)
如果您想在动态框架中使用 CoreData,则必须子类化NSPersistentContainer
并使用它而不是NSPersistentContainer
.
class PersistentContainer: NSPersistentContainer { }
//...
lazy var container: PersistentContainer = {
let result = PersistentContainer(name: "Your xcdatamodeld file name here")
result.loadPersistentStores { (storeDescription, error) in
if let error = error {
print(error.localizedDescription)
}
}
return result
}()
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
12546 次 |
最近记录: |