无法在 CoreData swift 中保存数据

Posted

技术标签:

【中文标题】无法在 CoreData swift 中保存数据【英文标题】:Could not save data in CoreData swift 【发布时间】:2021-03-04 13:17:17 【问题描述】:

我正在尝试将数据保存在 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 > 1completion(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")
    

【问题讨论】:

您需要在某处的主托管对象上下文中调用 save(),您会这样做吗? 【参考方案1】:

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

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

【讨论】:

以上是关于无法在 CoreData swift 中保存数据的主要内容,如果未能解决你的问题,请参考以下文章

在 CoreData 中保存 Swift CLLocation

Swift 3 Core Data - 无法保存关系值

将 CoreData 保存到 iCloud (Swift)

如何从 Swift 的后台线程中从 CoreData 中获取未保存的数据?

具有自定义类类型的 Swift CoreData 保存属性

如何在 Swift 中将可转换属性保存到 Core Data