viewContext没有被保存在数据库(app.sqlite)SWIFT
问题描述:
我创建了一个应用程序来保存学生的细节,使用NSPersistanceContainer,而我从json获取数据并保存到数据库,当时我“M越来越撷取结果计数> 0,如果我重新抓取结果计数返回0viewContext没有被保存在数据库(app.sqlite)SWIFT
lazy var persistentContainer: NSPersistentContainer = {
let container = NSPersistentContainer(name: "Students_dev")
let storeURL = try! FileManager
.default
.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
.appendingPathComponent("Students_dev.sqlite")
print("URL :",storeURL)
let storeDescription = NSPersistentStoreDescription(url: storeURL)
storeDescription.shouldMigrateStoreAutomatically = true
storeDescription.shouldMigrateStoreAutomatically = true
container.viewContext.automaticallyMergesChangesFromParent = true
container.persistentStoreDescriptions = [storeDescription]
container.loadPersistentStores(completionHandler: { (storeDescription, error) in
if let error = error as NSError? {
fatalError("Unresolved error \(error), \(error.userInfo)")
}
})
return container
}()
// MARK: - Core Data Saving support
func saveContext (context: NSManagedObjectContext) {
persistentContainer.performBackgroundTask({ (context) in
if context.hasChanges {
do {
try context.save()
} catch {
let nserror = error as NSError
fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
}
}
})
}
上下文不为空而我保存到数据库,当我检查sqlite的文件表是应用程序空。没有得到我方遗漏的东西。
答
的问题是在saveContext功能,上下文是没有得到保存到核心数据“persistentContainer.performBackgroundTask”,当我删除它,它工作正常。
代码
func saveContext (context: NSManagedObjectContext) {
if context.hasChanges {
do {
try context.save()
} catch {
let nserror = error as NSError
fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
}
}
}
答
我觉得CoreData警告的原因是这行代码:
container.viewContext.automaticallyMergesChangesFromParent = true
之前,您正在访问的viewContext
商店被加载。尝试移动负载持久性存储完成块内该行:
container.loadPersistentStores(completionHandler: { (storeDescription, error) in
if let error = error as NSError? {
fatalError("Unresolved error \(error), \(error.userInfo)")
}
container.viewContext.automaticallyMergesChangesFromParent = true
})
现在,警告已经走了,但是当我检查sqllite文件中的数据显示我空。 – Joe
您是否尝试在saveContext方法上设置断点并检查context.hasChanges是否为true?我只能猜测你可能没有保存创建新对象的上下文吗? – kharrison
context.hasChanges返回true – Joe