我正在尝试更新 Core Data 中的一个属性,然后显示它。但是,当我告诉程序显示它时,它显示的是原始值。
根据下面的代码,username
被设置为一个字符串。我 100% 知道 username
已保存到 Core Data 中。但是,当我尝试更新它时,它保存到核心数据,但打印出旧值。我怎样才能只打印出“最新”的值?
import UIKit
import CoreData
class NameSettings: UIViewController {
@IBOutlet var nameText: UITextField!
var userID: String!
var username: String!
override func viewDidLoad() {
super.viewDidLoad()
var appDel:AppDelegate = (UIApplication.sharedApplication().delegate as AppDelegate)
var context:NSManagedObjectContext = appDel.managedObjectContext!
var request = NSFetchRequest(entityName: "Users")
request.returnsObjectsAsFaults = false
var results: NSArray = context.executeFetchRequest(request, error: nil)!
var res = results [0] as NSManagedObject
userID = res.valueForKey("userID") as String
username = res.valueForKey("username") as String
println(username)
nameText.text = username
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
@IBAction func saveTapped(sender: AnyObject) {
//println(userID)
var query = PFQuery(className:"_User")
query.getObjectInBackgroundWithId(userID) {
(update1: PFObject!, error: NSError!) -> Void in
if error == nil {
update1["username"] = self.nameText.text
update1.saveEventually()
var appDel:AppDelegate = (UIApplication.sharedApplication().delegate as AppDelegate)
var context:NSManagedObjectContext = appDel.managedObjectContext!
var updateUser = NSEntityDescription.insertNewObjectForEntityForName("Users", inManagedObjectContext: context) as NSManagedObject
updateUser.setValue(self.nameText.text, forKey: "username")
context.save(nil)
//println(self.nameText.text)
self.navigationController?.popToRootViewControllerAnimated(true)
}
}
}
}
注意:所有的 println
只是为了调试。
最佳答案
就目前的代码而言,您没有覆盖任何 NSManagedObject
;您要插入一个新对象,即 insertNewObjectForEntityForName
。
相反,您可以做的是将要保存的 NSManagedObject
和要保存到的 NSManagedObjectContext
声明为全局变量;然后在保存到 NSManagedObjectContext
之前简单地为 NSManagedObject
的相关键设置一个新值,例如:
var userID: String!
var username: String!
var res : NSManagedObject!
var context : NSManagedObjectContext!
override func viewDidLoad() {
super.viewDidLoad()
//...
context = appDel.managedObjectContext! // <-- Use global var
var request = NSFetchRequest(entityName: "Users")
request.returnsObjectsAsFaults = false
var results: NSArray = context.executeFetchRequest(request, error: nil)!
res = results [0] as NSManagedObject // <-- Use global var
//...
}
@IBAction func saveTapped(sender: AnyObject) {
//println(userID)
var query = PFQuery(className:"_User")
query.getObjectInBackgroundWithId(userID) {
(update1: PFObject!, error: NSError!) -> Void in
if error == nil {
update1["username"] = self.nameText.text
update1.saveEventually()
res.setValue(self.nameText.text, forKey: "username")
context.save(nil)
//println(self.nameText.text)
self.navigationController?.popToRootViewControllerAnimated(true)
}
}
}
关于ios - 如何在 Swift 中覆盖核心数据属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27608130/