无法在 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