我之前在SOF上收到的答案有问题。 也就是说我完全理解了它所解释的概念,但是我在执行方面遇到了一些麻烦,我似乎经常失去使用格式entity.attribute读取/写入值的功能(使用函数创建)保存重复代码。)
我正在使用CoreData开展项目,CoreData是一个名为“Studio' Studio'以及名为' name' (串)。功能很简单,用户设置名称的值并保存,如果用户按下刷新键,则使用从CoreData获取的当前值更新文本标签。
我的代码的问题是我无意中创建了多个对象并随机调用它们。 我给出的解决方案是执行提取以查看对象是否存在并创建它(如果它没有)。
然而,因为我只希望使用我创建的任何属性的单个实例,并且我将为每个属性分配一个初始值,我想知道是否有人可以推荐这个概念的简单实现?
import UIKit
import CoreData
class ViewController: UIViewController {
@IBOutlet weak var studioBox: UITextField!
@IBOutlet weak var nameLabel: UILabel!
@IBAction func saveData(sender: AnyObject) {
var studio = writeStudioData()
studio.name = studioBox.text
}
@IBAction func Update(sender: AnyObject) {
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) as [Studio]
return result[0]
}
func writeStudioData () -> Studio {
let appDelegate =
UIApplication.sharedApplication().delegate as AppDelegate
let managedContext = appDelegate.managedObjectContext!
let entityDescription = NSEntityDescription.entityForName("Studio", inManagedObjectContext: managedContext)
let result = Studio(entity: entityDescription!, insertIntoManagedObjectContext: managedContext)
return result
}
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 :(得分:1)
CoreData对象映射到数据库中存储的内容。在这种情况下,在getStudioData
函数中,它返回一个“实时”对象。你可以从中读取它。但您也可以更新它并将更新写回CoreData。
你不这样做。相反,在writeStudioData
中,您正在调用Studio
构造函数,其副作用是将 new 实体添加到CoreData中。
相反,您应该使用从getStudioData
检索的实例。如果不存在此类实体,则可以创建新实体。否则,使用现有的。如果要保存更新,可以调用managedObjectContext.save()
- 这会将更改保留到CoreData存储中。
每次writeStudioData
时都不要创建新的。