无法在 CoreData 中保存数据 swift

Could not save data in CoreData swift

我正在尝试将数据保存在 CoreData 中。当应用程序 运行 一切正常。我收到数据已保存的信息,并收到正确提取的消息。但是当我关闭应用程序时,数据就消失在某处。

创建项目时我没有检查Core Data,所以我添加了xcdatamodel,导入CoreData 无处不在,更新 AppDelegate 使用正确的 NSPersistentContainer 名称(名称是我的 xcdatamodel 的名称)也在 Project-General-Frameworks 中添加CoreData.framework.

这里是保存、获取和删除数据的一部分。该文件与 VC 是分开的。我没有收到任何类型的错误。

在我的 VC 中,我只是调用 savedata() 来保存数据。它在应用程序关闭之前有效。

import UIKit
import CoreData

var cgsTeams = [TeamsCoreData]()

func savedata() {
        saveTeams { (complete) in
            if complete {print("TeamsSaved")}
        }
}

func saveTeams(completion: (_ finished: Bool) -> ()) {
    guard let managedContext = appDelegate?.persistentContainer.viewContext else {return}
    let privateManagedContext = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
    privateManagedContext.parent = managedContext
    
    
    
    for team in teams {
        let teamsCoreData = TeamsCoreData(context: privateManagedContext)
        teamsCoreData.team = team.name
        teamsCoreData.score = Int32(team.score)
        teamsCoreData.number = Int32(team.number)
        
        do{
            try privateManagedContext.save()
            debugPrint("Succesfully saved teamsCoreData")
            completion(true)
        } catch{
            debugPrint("Could not save - \(error)")
            completion(false)
        }
    }
}

func fetchTeams(completion: (_ complete: Bool) -> ()) {
    guard let managedContext = appDelegate?.persistentContainer.viewContext else { return }

    let fetchRequest = NSFetchRequest<TeamsCoreData>(entityName: "TeamsCoreData")

    do {
        cgsTeams = try managedContext.fetch(fetchRequest)
        print("cgsGameRules fetched")
        teams = [team]()
        for cgsTeam in cgsTeams {
            print("team - \(cgsTeam.team!) added")
            teams.append(team(name:cgsTeam.team!, number: Int(cgsTeam.number), score: Int(cgsTeam.score)))
        }
        if cgsTeams.count > 1{completion(true)} else {completion (false); print("No teams")}
    } catch {
        debugPrint("Could not fetch: \(error.localizedDescription)")
        completion(false)
    }
    
    
}

func deleteTeams(){
    guard let managedContext = appDelegate?.persistentContainer.viewContext else { return }
    let fetchRequest = NSFetchRequest<TeamsCoreData>(entityName: "TeamsCoreData")
    
    let objects = try! managedContext.fetch(fetchRequest)
    for obj in objects {
        managedContext.delete(obj)
    }

    do {
        try managedContext.save()
    } catch {
        print("error on delete Team")
    }
}

当您在 Core Data 中保存更改时,上下文仅保存到其父上下文。如果它没有父上下文,它会将更改保存到持久存储文件。您正在保存对 privateManagedObjectContext 的更改,它是 viewContext 的子上下文。但是您永远不会在 viewContext 上保存更改。因此,您的子上下文将更改告知父上下文,但父上下文永远不会将这些更改保存在任何地方。

您需要 (a) 保存对 viewContext 的更改,或 (b) 使 privateManagedObjectContext 成为其自己的独立上下文,而不是子上下文。