viewContext 未保存在数据库中(app.sqlite)
Posted
技术标签:
【中文标题】viewContext 未保存在数据库中(app.sqlite)【英文标题】:viewContext is not getting saved in the database (app.sqlite) 【发布时间】:2017-10-28 14:09:16 【问题描述】:我使用 NSPersistanceContainer 创建了一个应用程序来保存学生的详细信息,当我从 JSON 获取数据并保存到 db 时,我的获取结果计数 > 0。如果我重新启动应用程序获取结果计数返回 0。
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 文件时,表是空的。没有得到我身边缺少的东西。
没有数据被插入到 SQL 文件中
【问题讨论】:
【参考方案1】:我认为 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 文件时,数据显示我是空的。 您是否尝试在 saveContext 方法上设置断点并检查 context.hasChanges 是否为真?我只能猜测您可能没有保存创建新对象的上下文? context.hasChanges 正在返回 true 上下文更改:true 上下文对象:[问题出在 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)")
【讨论】:
以上是关于viewContext 未保存在数据库中(app.sqlite)的主要内容,如果未能解决你的问题,请参考以下文章
Swift 3 Core Data - 如何同步保存上下文?