在Swift中使用Core Data对象的单个实例

时间:2015-03-19 03:37:22

标签: swift core-data

我之前在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.
}


}

1 个答案:

答案 0 :(得分:1)

CoreData对象映射到数据库中存储的内容。在这种情况下,在getStudioData函数中,它返回一个“实时”对象。你可以从中读取它。但您也可以更新它并将更新写回CoreData。

你不这样做。相反,在writeStudioData中,您正在调用Studio构造函数,其副作用是将 new 实体添加到CoreData中。

相反,您应该使用从getStudioData检索的实例。如果不存在此类实体,则可以创建新实体。否则,使用现有的。如果要保存更新,可以调用managedObjectContext.save() - 这会将更改保留到CoreData存储中。

每次writeStudioData时都不要创建新的。