【问题标题】:How to overwrite Core Data attribute in Swift如何在 Swift 中覆盖 Core Data 属性
【发布时间】:2015-02-20 20:57:51
【问题描述】:

我正在尝试更新 Core Data 中的属性,然后显示它。但是,当我告诉程序显示它时,它会显示原始值。

根据下面的代码,username 设置为字符串。我 100% 知道 username 已保存到 Core Data 中。但是,当我尝试更新它时,它会保存到 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 仅用于调试。

【问题讨论】:

  • 使用insertNewObjectForEntityForName,您正在插入一个新值。不覆盖旧的。
  • 哦....我不知道核心数据的来龙去脉。你介意帮我解决这个问题吗? :)
  • 也许这个答案会有所帮助:stackoverflow.com/a/10572134/2274694
  • 我对 Obj-C 一无所知..... :/
  • 有没有办法可以删除当前值,然后“插入”新值?

标签: ios xcode core-data swift


【解决方案1】:

就目前的代码而言,您不会覆盖任何NSManagedObject;您正在插入一个新的,即insertNewObjectForEntityForName。

相反,您可以将要保存的NSManagedObject 和要保存到的NSManagedObjectContext 声明为全局变量;然后只需为NSManagedObject 的相关键设置一个新值,然后保存到NSManagedObjectContext,例如:

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)

        }
    }
}

【讨论】:

  • 漂亮!完美运行。感谢您的时间和帮助!至少现在我明白我哪里错了! :)
猜你喜欢
  • 2010-12-28
  • 1970-01-01
  • 2018-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多