我是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.
}
}
答案 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