无法在 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
成为其自己的独立上下文,而不是子上下文。
我正在尝试将数据保存在 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
成为其自己的独立上下文,而不是子上下文。