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 上下文对象:[(实体:Board;id:0x6030001a27b0 ;数据:...设置值... 尝试启用 SQL 调试,这样您就可以看到保存在做什么。在方案编辑器中添加以下内容作为启动参数:-com.apple.CoreData.SQLDebug 1(不要忘记前导“-”)。【参考方案2】:

问题出在 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 - 如何同步保存上下文?

Swift 和 SwiftUI 之间的 viewContext 是不是不同

数据未保存在文本框 properties.settings

CoreData - 创建新实体 - 为啥不需要保存它?

RedBean 数据未同步

对象未保存在 Celery 任务中