ios - 如何在 Swift 中覆盖核心数据属性

标签 ios xcode core-data swift

我正在尝试更新 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/

相关文章:

xcode - target 指定产品类型 'com.apple.product-type.app-extension' ,但是 'iphoneos' 平台没有这样的产品类型

ios - 如何限制我的应用程序仅适用于 iPhone

ios - 为什么生成的托管类没有 dealloc/release?

iphone - 邀请 Twitter 好友获取应用

ios - 如何快速更新用户默认值?

swift - 我应该在 Vapor 项目中的什么地方添加自己的 Markdown 文件?

ios - 保留周期与核心数据

iphone - iOS 核心数据 - 为什么有效?

ios - 是否可以使用 UIPageViewController 拥有类似于 Tweetbot 3 的应用内教程,它们漂浮在上方?

ios - merge git 分支缺陷后 Xcode 4 中 "No Scheme"问题的最佳解决方案