Ios Swift:保存(重写)和加载CoreData
首先,让我解释一下我的应用程序及其流程。应用程序打开,用户创建一个配置文件,通过核心数据存储所有数据。用户单击create之后,它会将它们发送到控制台屏幕,其中显示用户输入的部分信息,例如通过segue输入的名称。有一个选项卡,允许用户编辑其配置文件名称、重量、地址等。当用户编辑其信息以更改其名称、重量等时,还应更新控制台页面上显示的信息 我已经得到了要保存和加载的数据。我遇到的问题是当试图从编辑配置文件屏幕编辑数据时。。。用户更改字段中的文本,然后单击保存。出于某种原因,数据没有保存……至少我认为这是问题所在。当按下保存按钮时,文本字段返回到用户最初在创建配置文件屏幕上输入的内容,而不管输入的是什么文本 代码如下 斯威夫特Ios Swift:保存(重写)和加载CoreData,ios,swift,core-data,Ios,Swift,Core Data,首先,让我解释一下我的应用程序及其流程。应用程序打开,用户创建一个配置文件,通过核心数据存储所有数据。用户单击create之后,它会将它们发送到控制台屏幕,其中显示用户输入的部分信息,例如通过segue输入的名称。有一个选项卡,允许用户编辑其配置文件名称、重量、地址等。当用户编辑其信息以更改其名称、重量等时,还应更新控制台页面上显示的信息 我已经得到了要保存和加载的数据。我遇到的问题是当试图从编辑配置文件屏幕编辑数据时。。。用户更改字段中的文本,然后单击保存。出于某种原因,数据没有保存……至少我
// This struct would to get the data from the user
struct PInfo {
var firstName: String?
var lastName: String?
var cityState: String?
var streetAddress: String?
var gender: String?
var weight: NSNumber?
var phoneNumber: String?
var contactName: String?
var contactPhone: String?
}
func save(withPersonInfo p: PInfo, withContext context: NSManagedObjectContext) {
let entityDescription = NSEntityDescription.entity(forEntityName: "Person", in: context)
let managedObject = NSManagedObject(entity: entityDescription!, insertInto: context) as! Person
managedObject.firstName = p.firstName
managedObject.lastName = p.lastName
managedObject.cityState = p.cityState
managedObject.streetAddress = p.streetAddress
managedObject.gender = p.gender
managedObject.weight = p.weight as! Int16
managedObject.phoneNumber = p.phoneNumber
managedObject.contactName = p.contactName
managedObject.contactPhone = p.contactPhone
do {
try context.save()
print("Saved Successful")
}
catch let error as NSError {
print("Could not save. \(error), \(error.userInfo)")
}
}
func fetchSingleUser(withContext context:NSManagedObjectContext) -> PInfo {
let request: NSFetchRequest<Person> = Person.fetchRequest()
let coreData_items = try? context.fetch(request)
guard let items = coreData_items,
let firstItem = items.first
else {
fatalError("Error while querying") }
print("Loaded CoreData Items: \(firstItem)")
return PInfo(firstName: firstItem.firstName!, lastName:firstItem.lastName!, cityState: firstItem.cityState!, streetAddress: firstItem.streetAddress!, gender: firstItem.gender!, weight: firstItem.weight as NSNumber, phoneNumber: firstItem.phoneNumber!, contactName: firstItem.contactName, contactPhone: firstItem.contactPhone)
}
func userDataExists(withContext context: NSManagedObjectContext) -> Bool {
let request: NSFetchRequest<Person> = Person.fetchRequest()
let coreData_items = try? context.fetch(request)
guard let items = coreData_items,
let _ = items.first
else {
return false }
return true
}
我相信这是由于调试导致的保存问题,但我对CoreData不够熟悉,无法确切了解问题所在
非常感谢任何帮助/信息 我怀疑您的数据正在保存。但每次都要创建一个新对象,而不是更新现有对象的值。无论何时调用save方法,这一行:
let managedObject = NSManagedObject(entity: entityDescription!, insertInto: context) as! Person
创建一个新的Person对象。调用fetchSingleUser方法时,将获取所有Person对象:
但只使用这些项目中的第一项:
let firstItem = items.first
碰巧第一项是原始Person对象,具有原始值:因此textFields将恢复为原始值
如果应用程序应该只有一个Person对象,请更改保存方法以获取现有对象,并更新该实例的属性值,例如在保存方法中:
您不需要PInfo结构-核心数据是一个对象持久性系统。使用Xcode根据您的能力自动为您创建的人员,而不是NSManagedObjects。谢谢!现在一切都有意义了!我感谢你的帮助!
let coreData_items = try? context.fetch(request)
let firstItem = items.first
var managedObject : Person
let request: NSFetchRequest<Person> = Person.fetchRequest()
let coreData_items = try? context.fetch(request)
if let items = coreData_items {
if items.count > 0 {
managedObject = items.first
} else {
managedObject = NSManagedObject(entity: entityDescription!, insertInto: context) as! Person
}
managedObject.firstName = p.firstName
... etc
} else {
// coreData_items is nil, so some error handling here
}