Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/106.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Swift:保存(重写)和加载CoreData_Ios_Swift_Core Data - Fatal编程技术网

Ios Swift:保存(重写)和加载CoreData

Ios Swift:保存(重写)和加载CoreData,ios,swift,core-data,Ios,Swift,Core Data,首先,让我解释一下我的应用程序及其流程。应用程序打开,用户创建一个配置文件,通过核心数据存储所有数据。用户单击create之后,它会将它们发送到控制台屏幕,其中显示用户输入的部分信息,例如通过segue输入的名称。有一个选项卡,允许用户编辑其配置文件名称、重量、地址等。当用户编辑其信息以更改其名称、重量等时,还应更新控制台页面上显示的信息 我已经得到了要保存和加载的数据。我遇到的问题是当试图从编辑配置文件屏幕编辑数据时。。。用户更改字段中的文本,然后单击保存。出于某种原因,数据没有保存……至少我

首先,让我解释一下我的应用程序及其流程。应用程序打开,用户创建一个配置文件,通过核心数据存储所有数据。用户单击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
}