如何使用Core Data访问和使用实体

sli*_*fty 5 core-data ios swift

现在是时候使用Core Data了,但开放的文档和指南花了很多时间来讨论一般设置和细节"幕后"的细节.这些事情很重要,但我希望快速,干净的资料显示如何实际使用存储在Core Data模型中的信息.

情景

在我的简单示例中,我有一个实体类型:

Job
 - salary [Double]
 - dateCreated [Date]
Run Code Online (Sandbox Code Playgroud)

这是一个由故事板驱动的Swift iOS应用程序,默认生成的AppDelegate.swift处理我的托管对象上下文的生成.

问题

如何在我的应用程序中使用Job实例?

如果您还可以提供有关这些项目的见解,那么奖励积分:

  • 作为习惯于MVC设计模式的人,如何在不违反iOS开发最佳实践的情况下避免在我的控制器中包含脏数据访问?
  • 如何在关注DRY时访问Core Data中的实体?
  • 如何在保持类型的同时在方法和控制器之间传递托管对象?

Core Data文档提供了一些用于获取记录的片段.这个问题基本上是询问逻辑在iOS应用程序中的位置,以及如何在获取它们之后实际与获取的记录进行交互.

一个例子

这个问题并不是一个广泛而彻底的问题,因此我将在一个使用核心数据的示例尝试中将其作为基础.在我的例子中,我有一个带有标签的UIViewController.我希望这个标签显示工作的薪水.

import UIKit
import CoreData

class JobViewController: UIViewController {

    @IBOutlet var salaryLabel: UILabel!
    let managedObjectContext = (UIApplication.sharedApplication().delegate as AppDelegate).managedObjectContext

    func updateLabel() {
        var job = getCurrentJob()
        salaryLabel.text = job.salary // ERRORS
    }

    func getCurrentJob()->(???) {
        var error: NSError?
        if let fetchedResults = managedObjectContext!.executeFetchRequest(NSFetchRequest(entityName:"Job"), error: &error) {
            return fetchedResults[0]
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}
Run Code Online (Sandbox Code Playgroud)

此示例无法编译,原因有两个:

  1. 我没有为getCurrentJob指定返回类型,因为我不确定要返回什么类型
  2. 试图访问该salary属性的"ERRORS"行会出错,因为无法知道薪水是作业的实际属性.

如何传递并使用作业对象?

sli*_*fty 5

上面示例中的关键缺失部分是NSManagedObject子类,在Swift中是@NSManagedSwift注释.NSManagedObject是一个通用类,它以最简单的形式可以扩展为只提供对Core Data实体属性的访问,但实际上这是传统模型逻辑应该存在的地方.

创建NSManagedObject子类

您可以通过查看Core Data模型并使用菜单命令自动生成这些对象:Editor->Create NSManagedObject Subclass.

这将生成Job.swift(或任何您的实体名称)

import Foundation
import CoreData

class Job: NSManagedObject {

    @NSManaged var dateCreated: NSDate
    @NSManaged var salary: NSNumber

}
Run Code Online (Sandbox Code Playgroud)

使用NSManagedObject子类

您的新课程现在可供使用,您可以相应地对获取的结果进行类型转换!完成后,这是以前破坏的示例的更新版本

import UIKit
import CoreData

class JobViewController: UIViewController {

    @IBOutlet var salaryLabel: UILabel!
    let managedObjectContext = (UIApplication.sharedApplication().delegate as AppDelegate).managedObjectContext

    func updateLabel() {
        var job:Job = getCurrentJob()
        salaryLabel.text = job.salary // ERRORS
    }

    func getCurrentJob()->Job {
        var error: NSError?
        if let fetchedResults = managedObjectContext!.executeFetchRequest(NSFetchRequest(entityName:"Job"), error: &error) {
            return fetchedResults[0]
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}
Run Code Online (Sandbox Code Playgroud)