简体   繁体   中英

CoreData not saving information after being updated

This function is supposed to add the current date into a list that is stored in memory whenever an addButton is pressed, however whenever the app is closed and reloaded the new date does not appear. The data also seems to disappear after switching views.

var selectedPersonFirst = ""
var selectedPersonLast = ""
let today = NSDate()



let managedObjectContext = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext

@IBAction func addButtonPressed(sender: AnyObject) {

    let entityDescription = NSEntityDescription.entityForName("People", inManagedObjectContext: managedObjectContext!)
    let request = NSFetchRequest()
    request.entity = entityDescription

    let firstPred = NSPredicate(format: "(firstName = %@)", selectedPersonFirst)
    let secondPred = NSPredicate(format: "(lastName = %@)", selectedPersonLast)

    let predicate = NSCompoundPredicate(type: NSCompoundPredicateType.OrPredicateType, subpredicates: [firstPred, secondPred])
    request.predicate = predicate

    var error: NSError?

    var objects = managedObjectContext?.executeFetchRequest(request, error: &error)

    if let results = objects{

        let days = results[0].valueForKey("days") as! NSMutableArray
        days.addObject(NSDate())

        let person = results[0] as! People
        person.setValue(days, forKey: "days")

    }

    managedObjectContext!.save(nil)

    self.tableView.reloadData()

}

Here is the people subclass of NSManagedObject:

import Foundation
import CoreData

class People: NSManagedObject {

    @NSManaged var days: AnyObject
    @NSManaged var dayZero: NSDate
    @NSManaged var firstName: String
    @NSManaged var gender: String
    @NSManaged var lastName: String

}

ViewController in which the days NSMutableArray is created:

import UIKit
import CoreData

class NewPersonViewController: UIViewController {

    @IBOutlet weak var firstName: UITextField!
    @IBOutlet weak var lastName: UITextField!
    @IBOutlet weak var gender: UISegmentedControl!
    @IBOutlet weak var dayZeroDate: UIDatePicker!

    let managedObjectContext = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext

    var personName : String = ""
    var currentDayNumber : Int? = nil

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }




    // MARK: - Navigation

    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        // Get the new view controller using segue.destinationViewController.
        // Pass the selected object to the new view controller.

        if segue.identifier == "DoneNewPersonSegue" {

            let entityDescription = NSEntityDescription.entityForName("People", inManagedObjectContext: managedObjectContext!)

            let person = People(entity: entityDescription!, insertIntoManagedObjectContext: managedObjectContext)

            person.firstName = self.firstName.text
            person.lastName = self.lastName.text
            person.days = NSMutableArray()
            person.gender = gender.description
            person.dayZero = dayZeroDate.date

            save()

        }



    }

    func save() {
        var error : NSError?
        if(managedObjectContext!.save(&error) ) {
            println(error?.localizedDescription)
        }
    }


}

Data Model:

资料模型

The problem was that I was using a mutable type, so a change wasn't calling the setter method. I changed the code to create a copy of the object so the change would be recognized:

let days1 = results[0].valueForKey("days") as! NSMutableArray
let days = days1.mutableCopy() as! NSMutableArray 

days.addObject(NSDate())
let person = results[0] as! People

person.setValue(days, forKey: "days”)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM