使用entity.attribute从Core Data返回值?

时间:2015-03-10 22:44:47

标签: swift core-data

我是swift的新手,并且在使用CoreData时遇到了麻烦,我正在寻找一种简化读取和写入值的方法,特别是能够用类似的东西编写它们:

entity.attribute = variable

并使用类似于:

的内容检索它们
variable = entity.attribute

我有一个名为' Studio'使用名为' name'的属性(串)。 我已经创建了一个NSManagedObject子类(Studio.swift),并将该类更新为“testapp.Studio”。

在下面的示例代码中,IBAction saveData会将studioBox.text写入CoreData,但是IBAction更新会引发一些错误。

var Studio = getStudioData() 
  

模式变量绑定不能出现在表达式中

nameLabel.text = Studio.name
  

' Studio.Type'没有名为' name'

的成员

最后在getStudioData函数中:

return studio
  

' NSArray的'不是' Studio'

的子类型

以下是我的完整代码:

import UIKit
import CoreData

class ViewController: UIViewController {

@IBOutlet weak var studioBox: UITextField!

@IBOutlet weak var nameLabel: UILabel!

@IBAction func saveData(sender: AnyObject) {
    var info: String = studioBox.text!
    var Studio = dbconnect()
    Studio.name = info as String
}
@IBAction func Update(sender: AnyObject) {
    var info: String =
    var Studio = getStudioData()
    nameLabel.text = Studio.name
}


func getStudioData() -> Studio {
    let appDelegate =
    UIApplication.sharedApplication().delegate as AppDelegate
    let managedContext = appDelegate.managedObjectContext!
    let request = NSFetchRequest(entityName: "Studio")
    request.returnsObjectsAsFaults = false

    let result = managedContext.executeFetchRequest(request, error: nil)!
    let studio = result
    return studio

}

func dbconnect () -> Studio {
    let appDelegate =
    UIApplication.sharedApplication().delegate as AppDelegate
    let managedContext = appDelegate.managedObjectContext!
    let entityDescription = NSEntityDescription.entityForName("Studio", inManagedObjectContext: managedContext)
    let studio = Studio(entity: entityDescription!, insertIntoManagedObjectContext: managedContext)
    return studio
}

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
}

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

1 个答案:

答案 0 :(得分:0)

首先,获取请求返回一个对象数组。因此,如果你想返回一个Studio,你应该返回这个数组的一个对象(例如第一个)。不要忘记将获取结果转换为正确的类型数组。

let result = managedContext.executeFetchRequest(request, error: nil) as [Studio]
// check if result.count > 0
return result[0]

这解释了第一个和第三个错误。第二个似乎是由于大写的Studio指的是类,而不是实例,即托管对象。虽然使用大写首字母的变量名称是“合法的”,但这是不好的做法,因为它会降低您的代码的可读性。对于类名称,请使用Studio等名称,对变量名称使用studio

nameLabel.text = studio.name