CoreData更新后不保存信息
CoreData not saving information after being updated
此函数应该将当前日期添加到一个列表中,该列表在按下 addButton 时存储在内存中,但是无论何时关闭并重新加载应用程序,新日期都不会出现。切换视图后数据似乎也消失了。
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()
}
这是 NSManagedObject 的 people 子类:
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 其中创建了 days
NSMutableArray:
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)
}
}
}
数据模型:
问题是我使用的是可变类型,所以更改没有调用 setter 方法。我更改了代码以创建对象的副本,以便识别更改:
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”)
此函数应该将当前日期添加到一个列表中,该列表在按下 addButton 时存储在内存中,但是无论何时关闭并重新加载应用程序,新日期都不会出现。切换视图后数据似乎也消失了。
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()
}
这是 NSManagedObject 的 people 子类:
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 其中创建了 days
NSMutableArray:
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)
}
}
}
数据模型:
问题是我使用的是可变类型,所以更改没有调用 setter 方法。我更改了代码以创建对象的副本,以便识别更改:
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”)