코어 데이터 자습서 시작하기

이 튜토리얼에 의해 우리의 책 코어 데이터에서 요약 된 장입니다. 이 튜토리얼은 우리의 이오스 12 출시 파티의 일환으로 제공됩니다-즐기십시오!

핵심 데이터에 오신 것을 환영합니다!

이 자습서에서는 첫 번째 핵심 데이터 앱을 작성합니다. 당신은 데이터 모델 편집기에 스타터 코드 템플릿에서 엑스 코드에서 제공하는 모든 자원을 시작하는 것이 얼마나 쉬운 지 볼 수 있습니다.

당신은 처음부터 바로 실행 땅을 칠거야. 튜토리얼의 끝에 당신은 방법을 알 수 있습니다:

  • 코어 데이터에 새 레코드 추가
  • 코어 데이터에서 레코드 세트 가져 오기
  • 테이블 뷰를 사용하여 가져온 레코드를 표시합니다.

또한 핵심 데이터가 무대 뒤에서 무엇을하고 있는지,그리고 움직이는 다양한 조각과 어떻게 상호 작용할 수 있는지 알 수 있습니다. 단일 보기 앱 템플릿을 기반으로 새 프로젝트를 만듭니다. 앱 히트 목록의 이름을 지정하고 핵심 데이터 사용이 선택되어 있는지 확인합니다.

다음 예제에서는 코어 데이터 사용 확인란을 선택하여NSPersistentContainer로 알려진 상용구 코드를 생성할 수 있습니다.스위프트.

NSPersistentContainer는 핵심 데이터에서 정보를 저장하고 검색하는 데 도움이 되는 개체 집합으로 구성됩니다. 이 컨테이너 내부에는 코어 데이터 상태를 전체적으로 관리하는 개체,데이터 모델을 나타내는 개체 등이 있습니다.

표준 스택은 대부분의 앱에서 잘 작동하지만 앱 및 해당 데이터 요구 사항에 따라 보다 효율적으로 스택을 사용자 지정할 수 있습니다.

주: 응용 프로그램에서 모든 엑스 코드 템플릿은 코어 데이터로 시작하는 옵션이 있습니다. 엑스 코드 10 에서 만 마스터-세부 사항 응용 프로그램 및 단일 뷰 응용 프로그램 템플릿은 코어 데이터 사용 체크 박스가 있습니다.

이 샘플 응용 프로그램에 대한 아이디어는 간단하다:당신의 고유의”히트 목록”에 대한 이름의 목록과 테이블보기가있을 것입니다. 이 목록에 이름을 추가하고 결국 핵심 데이터를 사용하여 데이터가 세션 사이에 저장되는지 확인할 수 있습니다. 우리는이 사이트에 폭력을 묵과하지 않습니다,그래서 당신은 물론,너무 친구를 추적 할 즐겨 찾기 목록으로이 응용 프로그램을 생각할 수 있습니다!

메인 클릭.스토리 보드는 인터페이스 빌더에서 엽니 다. 캔버스에서 뷰 컨트롤러를 선택하고 탐색 컨트롤러 안에 포함합니다. 엑스 코드의 편집기 메뉴에서 포함을 선택…

탐색 컨트롤러의 탐색 모음을 클릭하여 선택한 다음 속성 검사기에서 큰 제목을 선호합니다. 이 샘플 응용 프로그램에게 애플의 주식 애플 리케이션과 일치하는 제목 스타일을 제공 할 것입니다.

그런 다음 개체 라이브러리에서 테이블 뷰를 뷰 컨트롤러로 끈 다음 전체 뷰를 커버하도록 크기를 조정합니다.

아직 열려 있지 않은 경우 캔버스의 왼쪽 아래 모서리에 있는 아이콘을 사용하여 인터페이스 빌더의 문서 윤곽을 엽니다.

문서 개요의 테이블 보기에서 상위 보기로 드래그한 다음 안전 영역 제한으로 이어지는 공간을 선택합니다:

이 작업을 세 번 더 수행하여 후행 공간을 안전한 영역으로,상단 공간을 안전한 영역으로,마지막으로 하단 공간을 안전한 영역으로 선택합니다. 이 네 가지 제약 조건을 추가하면 테이블 뷰가 상위 뷰를 채울 수 있습니다.

다음으로 막대 버튼 항목을 드래그하여 뷰 컨트롤러의 탐색 모음에 놓습니다. 마지막으로,바 버튼 항목을 선택하고 추가 할 시스템 항목을 변경합니다.

캔버스는 다음 스크린샷과 비슷해야 합니다:

추가 버튼을 누를 때마다 텍스트 필드가 포함된 경고 컨트롤러가 나타납니다. 여기에서,당신은 텍스트 필드에 다른 사람의 이름을 입력 할 수 있습니다. Save를 탭하면 이름을 저장하고 경고 컨트롤러를 닫은 다음 테이블 보기를 새로 고침하여 입력한 모든 이름이 표시됩니다.

하지만 먼저 뷰 컨트롤러를 테이블 뷰의 데이터 원본으로 만들어야 합니다. 캔버스에서 테이블 뷰에서 아래 그림과 같이 탐색 모음 위의 노란색 뷰 컨트롤러 아이콘으로 드래그한 다음 데이터 소스를 클릭합니다:

당신이 궁금해하는 경우에,당신은 어떤 작업을 트리거하지 않습니다 셀을 탭하기 때문에 테이블 뷰의 대리자를 설정할 필요가 없습니다. 그것은 이것보다 간단하지 않습니다!

명령-옵션-입력을 누르거나 엑스 코드 표시 줄에 편집기 도구 집합에서 가운데 버튼을 선택하여 보조 편집기를 엽니 다.테이블 뷰에서 뷰 컨트롤러로 드래그합니다.클래스 정의 내부 스위프트IBOutlet를 만들 수 있습니다.

다음으로 새IBOutlet속성tableView의 이름을 지정하고 다음 줄을 만듭니다:

@IBOutlet weak var tableView: UITableView!

그런 다음 추가 버튼에서 뷰 컨트롤러로 드래그합니다.당신의viewDidLoad()정의 바로 아래 스위프트. 이번에는 콘센트 대신 형식을 사용하여 메서드addName의 이름을 지정하는 작업을 만듭니다UIBarButtonItem:

@IBAction func addName(_ sender: UIBarButtonItem) { }

이제 코드에서 테이블 보기 및 막대 단추 항목의 동작을 참조할 수 있습니다.

다음으로 테이블 뷰의 모델을 설정합니다. 뷰 컨트롤러에 다음 속성을 추가합니다.아래 스위프트tableView IBOutlet:

var names: = 

names 테이블 뷰에 표시된 문자열 값을 보유하는 변경 가능한 배열입니다. 그런 다음viewDidLoad()의 구현을 다음과 같이 바꿉니다:

override func viewDidLoad() { super.viewDidLoad() title = "The List" tableView.register(UITableViewCell.self, forCellReuseIdentifier: "Cell")}

이렇게 하면 탐색 모음에 제목을 설정하고UITableViewCell클래스를 테이블 보기에 등록합니다.

참고:register(_:forCellReuseIdentifier:)dequeue메서드에 셀 재사용 식별자를 제공할 때 테이블 뷰가 올바른 형식의 셀을 반환하도록 보장합니다.

다음,여전히 뷰 컨트롤러에.스위프트,클래스 정의 아래에 다음UITableViewDataSource확장을 추가하십시오ViewController:

// MARK: - UITableViewDataSourceextension ViewController: UITableViewDataSource { func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return names.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) cell.textLabel?.text = names return cell }}

UITableView로 작업 한 적이 있다면이 코드는 매우 친숙 해 보일 것입니다. 먼저 테이블의 행 수를names배열의 항목 수로 반환합니다.

다음으로tableView(_:cellForRowAt:)테이블 뷰 셀을 큐에서 제거하고names배열의 해당 문자열로 채웁니다.

다음으로 테이블 뷰에 새 이름을 표시할 수 있는 방법이 필요합니다. 이전에 코드로 끌어온addNameIBAction메서드를 구현합니다:

// Implement the addName IBAction@IBAction func addName(_ sender: UIBarButtonItem) { let alert = UIAlertController(title: "New Name", message: "Add a new name", preferredStyle: .alert) let saveAction = UIAlertAction(title: "Save", style: .default) { action in guard let textField = alert.textFields?.first, let nameToSave = textField.text else { return } self.names.append(nameToSave) self.tableView.reloadData() } let cancelAction = UIAlertAction(title: "Cancel", style: .cancel) alert.addTextField() alert.addAction(saveAction) alert.addAction(cancelAction) present(alert, animated: true)}

당신이 추가 버튼을 누를 때마다,이 방법은 텍스트 필드와 두 개의 버튼이있는UIAlertController을 선물 할 것이다:저장 및 취소.

저장 현재 텍스트 필드를names배열에 삽입한 다음 테이블 뷰를 다시 로드합니다. names배열은 테이블 뷰를 뒷받침하는 모델이므로 텍스트 필드에 입력한 내용이 테이블 뷰에 표시됩니다.

마지막으로 앱을 처음 빌드하고 실행합니다. 그런 다음 추가 버튼을 누릅니다. 경고 컨트롤러는 다음과 같습니다:

목록에 4 개 또는 5 개의 이름을 추가합니다. 아래와 비슷한 것을 볼 수 있습니다:

테이블 뷰는 데이터를 표시하고 배열은 이름을 저장하지만 여기서 누락 된 큰 것은 지속성입니다. 배열은 메모리에 있지만 응용 프로그램을 종료하거나 장치를 다시 부팅 강제로 경우,당신의 히트 목록이 전멸됩니다. 핵심 데이터는 지속성을 제공하므로 데이터를 더 내구성 있는 상태로 저장할 수 있으므로 앱 재실행 또는 기기 재부팅보다 오래 사용할 수 있습니다.

아직 핵심 데이터 요소를 추가하지 않았으므로 앱에서 벗어나면 아무 것도 유지되지 않습니다. 이것을 밖으로 시험하자. 당신이 시뮬레이터를 사용하는 경우 물리적 장치 또는 이에 상응하는(시프트++++시간)를 사용하는 경우 홈 버튼을 누릅니다. 이 홈 화면에 다시 익숙한 응용 프로그램 그리드에 당신을 데려 갈 것이다:

홈 화면에서 히트 목록 아이콘을 탭하여 앱을 포그라운드로 되돌립니다. 이름은 여전히 화면에 있습니다. 무슨 일이야?

홈 버튼을 누르면 현재 포 그라운드의 앱이 배경으로 이동합니다. 이 경우 운영 체제는 이름 배열의 문자열을 포함하여 현재 메모리에있는 모든 것을 플래시합니다. 마찬가지로,깨어나서 포그라운드로 돌아갈 때가되면,운영 체제는 결코 떠나지 않은 것처럼 메모리에 있던 것을 복원합니다.

애플은 4 에서 멀티 태스킹에서 이러한 발전을 도입했다. 이 앱은 사용자의 원활한 환경을 제공하지만 개발자들의 지속성에 대한 정의에 주름을 더합니다. 이름이 정말로 지속됩니까?

아니,정말. 당신은 완전히 빠른 응용 프로그램 스위처에서 응용 프로그램을 살해하거나 휴대 전화를 해제 한 경우,그 이름은 사라질 것입니다. 당신은 또한 이것을 확인할 수 있습니다. 앱을 포그라운드에 두고 빠른 앱 전환기를 입력합니다. 당신은 당신의 장치가 하나가있는 경우 두 번 홈 버튼을 누르거나 천천히 당신이 아이폰 엑스에 있다면 화면 하단에서 위쪽으로 드래그하여이 작업을 수행 할 수 있습니다.

여기에서 히트 목록 앱 스냅 샷을 위쪽으로 쓸어 넘겨 앱을 종료합니다. 당신이 아이폰 엑스에서 작업하는 경우 빨간색 삭제 버튼이 오른쪽 상단에 나타날 때까지,당신은 긴 눌러 응용 프로그램 스냅 샷이 있습니다.

앱 전환기에서 앱을 제거한 후에는 리빙 메모리에 히트 리스트의 흔적이 없어야합니다(말장난 의도 없음). 이름이 홈 화면으로 돌아가서 새로운 출시를 트리거 히트리스트 아이콘을 눌러 사라 확인합니다.

플래시 동결과 지속성의 차이는 멀티태스킹이 작동하는 방식에 익숙하다면 분명할 수 있다. 그러나 사용자의 생각에는 차이가 없습니다. 사용자는 이름이 여전히 존재하는 이유,앱이 배경에 들어갔다가 돌아 왔는지 또는 앱이 저장하고 다시로드했기 때문에 상관하지 않습니다. 중요한 것은 앱이 다시 올 때 이름이 여전히 있다는 것입니다!

따라서 지속성의 실제 테스트는 새로운 앱 출시 후에도 데이터가 여전히 존재하는지 여부입니다.

데이터 모델링

이제 지속성을 확인하는 방법을 알고 핵심 데이터에 뛰어들 수 있습니다. 히트리스트 앱의 목표는 간단합니다.

이 시점까지,당신은 메모리에 이름을 저장하기 위해 일반 오래된 스위프트 문자열을 사용 해왔다. 이 섹션에서는 이러한 문자열을 핵심 데이터 개체로 바꿉니다.

첫 번째 단계는 코어 데이터가 디스크의 데이터를 나타내는 방식을 설명하는 관리 대상 개체 모델을 만드는 것입니다.따라서 데이터 모델을 데이터베이스 스키마로 생각할 수 있습니다.

참고:핵심 데이터를 다룰 때 꽤 많이 관리되는 단어를 보게 될 것입니다. NSManagedObjectContext과 같이 클래스 이름에”관리됨”이 표시되면 핵심 데이터 클래스를 다룰 가능성이 있습니다. “관리됨”은 핵심 데이터의 핵심 데이터 객체의 수명주기를 관리하는 것을 의미합니다.

그러나 모든 핵심 데이터 클래스에”관리됨”이라는 단어가 포함되어 있다고 가정하지 마십시오. 핵심 데이터 클래스의 포괄적 인 목록을 보려면 문서 브라우저에서 핵심 데이터 프레임 워크 참조를 확인하십시오.

코어 데이터를 사용하기로 결정했기 때문에,엑스코드는 자동으로 데이터 모델 파일을 생성하여 히트리스트라는 이름을 붙였습니다.데이터모델드

히트 목록을 엽니다.데이터모델드 당신이 볼 수 있듯이,엑스 코드는 강력한 데이터 모델 편집기를 가지고:

데이터 모델 편집기에는 나중에 탐색할 수 있는 많은 기능이 있습니다. 지금은 단일 코어 데이터 엔티티를 만드는 데 초점을 맞추겠습니다.

왼쪽 하단의 엔터티 추가를 클릭하여 새 엔터티를 만듭니다. 새 엔터티를 두 번 클릭하고 이름을 다음과 같이 사람으로 변경합니다:

모델 편집기가 왜Entity.라는 용어를 사용하는지 궁금 할 것입니다. 당신이 곧 볼 수 있듯이,핵심 데이터는 자신의 어휘와 함께 제공됩니다. 다음은 일반적으로 발생하는 몇 가지 용어의 빠른 개요입니다:

  • 엔터티는 핵심 데이터의 클래스 정의입니다. 고전적인 예는Employee또는Company입니다. 관계형 데이터베이스에서 엔터티는 테이블에 해당합니다.
  • 속성은 특정 엔터티에 연결된 정보 조각입니다. 예를 들어Employee엔터티는 직원의name,positionsalary에 대한 속성을 가질 수 있습니다. 데이터베이스에서 특성은 테이블의 특정 필드에 해당합니다.
  • 관계는 여러 엔티티 간의 링크입니다. 핵심 데이터에서 두 엔터티 간의 관계는 대일 관계라고 하는 반면,한 엔터티와 여러 엔터티 간의 관계는 대다 관계라고 합니다. 예를 들어,Manager는 직원 집합과 다 대다 관계를 가질 수 있지만 개인Employee은 일반적으로 관리자와 대일 관계를 갖습니다.
참고:엔티티가 클래스처럼 많이 들리는 것을 눈치 챘을 것입니다. 마찬가지로 속성과 관계는 속성과 많이 비슷합니다. 차이점은 무엇입니까? 핵심 데이터 엔터티는 클래스 정의로,관리되는 개체는 해당 클래스의 인스턴스로 생각할 수 있습니다.

이제 속성이 무엇인지 알면 이전에 만든Person개체에 속성을 추가 할 수 있습니다. 아직 히트리스트에 있습니다.왼쪽에서Person을 선택하고 특성 아래의 더하기 기호(+)를 클릭합니다.

새 속성의 이름을,어,이름으로 설정하고 형식을 문자열로 변경합니다:

핵심 데이터에서 속성은 여러 데이터 유형 중 하나 일 수 있습니다.

코어 데이터에 저장

뷰 컨트롤러를 엽니다.스위프트,UIKit가져 오기 아래에 다음과 같은 핵심 데이터 모듈 가져 오기를 추가:

import CoreData

이 가져 오기는 코드에서 핵심 데이터를 사용하기 시작하는 데 필요한 모든 것입니다.

다음으로names속성 정의를 다음과 바꿉니다:

var people: = 

문자열 이름이 아닌Person엔터티를 저장하므로 테이블 뷰의 데이터 모델 역할을 하는 배열의 이름을people로 바꿉니다. 이제 간단한 문자열이 아닌NSManagedObject의 인스턴스를 보유합니다.

NSManagedObject은 코어 데이터에 저장된 단일 개체를 나타내므로 코어 데이터 영구 저장소에서 생성,편집,저장 및 삭제하는 데 사용해야 합니다. 곧 볼 수 있듯이NSManagedObject은 셰이프 쉬프터입니다. 데이터 모델의 모든 엔터티 형식을 취하여 정의한 속성 및 관계를 사용할 수 있습니다.

테이블 뷰의 모델을 변경하고 있으므로 이전에 구현된 두 데이터 원본 메서드도 교체해야 합니다. UITableViewDataSource확장을 다음과 같이 바꿉니다:

// MARK: - UITableViewDataSourceextension ViewController: UITableViewDataSource { func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return people.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let person = people let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) cell.textLabel?.text = person.value(forKeyPath: "name") as? String return cell }}

이러한 방법의 가장 큰 변화는tableView(_:cellForRowAt:)에서 발생합니다. 모델 배열의 해당 문자열과 셀을 일치시키는 대신 해당NSManagedObject과 셀을 일치시킵니다.

NSManagedObject에서name속성을 가져 오는 방법에 유의하십시오. 그것은 여기에서 일어난다:

cell.textLabel?.text = person.value(forKeyPath: "name") as? String

왜 이렇게 해야 하나요? 알고 보니NSManagedObject은 데이터 모델에 정의한name특성에 대해 알지 못하므로 속성으로 직접 액세스 할 수있는 방법이 없습니다. 핵심 데이터가 값을 읽기 위해 제공하는 유일한 방법은 키-값 코딩입니다.

참고:문자열을 사용 하 여 간접적으로 개체의 속성에 액세스 하기 위한 기초의 메커니즘입니다. 이 경우 런타임에NSMangedObject이 사전처럼 동작합니다.

키-값 코딩은NSManagedObject을 포함하여NSObject에서 상속하는 모든 클래스에서 사용할 수 있습니다. 8893>에서 내려가지 않는 스위프트 객체에서는 속성에 액세스할 수 없습니다.

다음으로addName(_:)를 찾아saveUIAlertAction을 다음으로 바꿉니다:

let saveAction = UIAlertAction(title: "Save", style: .default) { action in guard let textField = alert.textFields?.first, let nameToSave = textField.text else { return } self.save(name: nameToSave) self.tableView.reloadData()}

그러면 텍스트 필드의 텍스트가save(name:)이라는 새 메서드로 전달됩니다. 16>은 아직 존재하지 않기 때문에 불평합니다. 아래에 추가addName(_:):

func save(name: String) { guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return } // 1 let managedContext = appDelegate.persistentContainer.viewContext // 2 let entity = NSEntityDescription.entity(forEntityName: "Person", in: managedContext)! let person = NSManagedObject(entity: entity, insertInto: managedContext) // 3 person.setValue(name, forKeyPath: "name") // 4 do { try managedContext.save() people.append(person) } catch let error as NSError { print("Could not save. \(error), \(error.userInfo)") }}

이것은 핵심 데이터가 시작되는 곳입니다! 코드가 수행하는 작업은 다음과 같습니다:

  1. 핵심 데이터 저장소에서 아무 것도 저장하거나 검색하기 전에 먼저NSManagedObjectContext에 손을 대야 합니다. 관리되는 개체 컨텍스트를 관리되는 개체 작업을 위한 메모리 내”스크래치 패드”로 간주할 수 있습니다.먼저 관리되는 새 개체를 관리되는 개체 컨텍스트에 삽입합니다.

    엑스 코드는 이미 새 프로젝트의 템플릿의 일부로 관리되는 개체 컨텍스트를 생성했습니다. 이 작업은 처음에 코어 데이터 사용 확인란을 선택한 경우에만 발생합니다. 이 기본 관리되는 개체 컨텍스트는 응용 프로그램 대리자에서NSPersistentContainer의 속성으로 사용됩니다. 액세스하려면 먼저 앱 대리자에 대한 참조를 가져옵니다.

  2. 새 관리되는 개체를 만들어 관리되는 개체 컨텍스트에 삽입합니다. NSManagedObject의 정적 방법 인entity(forEntityName:in:)을 사용하여 한 단계로이 작업을 수행 할 수 있습니다.

    당신은NSEntityDescription가 무엇에 관한 것인지 궁금해 할 것입니다. 이전에NSManagedObject은 모든 엔티티를 나타낼 수 있기 때문에 셰이프 쉬프터 클래스라고 불렀습니다. 엔터티 설명은 데이터 모델의 엔터티 정의를 런타임에NSManagedObject인스턴스와 연결하는 부분입니다.

  1. 손에NSManagedObject,키-값 코딩을 사용 하 여name속성을 설정 합니다. 그렇지 않으면 런타임에 앱이 중단됩니다.
  2. 변경 내용을person로 커밋하고 관리되는 개체 컨텍스트에서save을 호출하여 디스크에 저장합니다. 참고save는 오류를 발생시킬 수 있으므로do-catch블록 내에서try키워드를 사용하여 호출 할 수 있습니다. 마지막으로,테이블 뷰가 다시 로드될 때 표시되도록people배열에 새 관리 개체를 삽입합니다.

문자열 배열을 사용하는 것보다 조금 더 복잡하지만 너무 나쁘지는 않습니다. 관리되는 객체 컨텍스트 및 엔티티를 가져 오는 것과 같은 일부 코드는 자신의init()또는viewDidLoad()에서 한 번만 수행 한 다음 나중에 재사용 할 수 있습니다. 단순화를 위해,당신은 같은 방법으로 모든 일을하고 있습니다.

앱을 빌드하고 실행하고 테이블 뷰에 몇 개의 이름을 추가합니다:

이름이 실제로 핵심 데이터에 저장되어 있는 경우 히트 목록 앱은 지속성 테스트를 통과해야 합니다. 포 그라운드에서 응용 프로그램과 함께,빠른 응용 프로그램 스위처로 이동 한 다음 종료합니다.

발판에서 히트 목록 앱을 탭하여 새 출시를 트리거합니다. 잠깐,무슨 일이야? 테이블 뷰가 비어 있습니다:

핵심 데이터에 저장했지만 새로운 앱 실행 후people배열이 비어 있습니다! 데이터가 당신을 기다리고 디스크에 앉아 있기 때문이다,하지만 당신은 아직 표시하지 않을.

핵심 데이터에서 페치

영구 저장소에서 관리되는 개체 컨텍스트로 데이터를 가져오려면 데이터를 페치해야 합니다. 뷰 컨트롤러를 엽니다.스위프트 아래에 다음을 추가viewDidLoad():

override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) //1 guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return } let managedContext = appDelegate.persistentContainer.viewContext //2 let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: "Person") //3 do { people = try managedContext.fetch(fetchRequest) } catch let error as NSError { print("Could not fetch. \(error), \(error.userInfo)") }}

단계적으로,이 코드가 수행하는 것입니다:

  1. 핵심 데이터로 모든 작업을 수행하려면 관리되는 개체 컨텍스트가 필요합니다. 가져 오는 것은 다르지 않습니다! 이전과 마찬가지로 응용 프로그램 대리자를 끌어 올려 영구 컨테이너에 대한 참조를 가져와NSManagedObjectContext에 손을 댑니다.
  2. 이름에서 알 수 있듯이NSFetchRequest는 핵심 데이터에서 가져 오는 클래스입니다. 가져 오기 요청은 강력하고 유연한 모두 있습니다. 인출 요청을 사용하여 제공된 조건(예: 나에게 위스콘신에 살고있는 모든 직원을주고 적어도 3 년 회사와 함께왔다),개별 값(즉,나에게 데이터베이스에서 가장 긴 이름을 부여)및 더 많은.

    가져 오기 요청에는 반환 된 결과 집합을 구체화하는 데 사용되는 여러 한정자가 있습니다. 지금은NSEntityDescription가 이러한 필수 한정자 중 하나라는 것을 알아야합니다.

    페치 요청의entity속성을 설정하거나init(entityName:)으로 초기화하면 특정 엔터티의 모든 개체를 페치합니다. 이것은 모든Person엔티티를 가져 오기 위해 여기에서 수행하는 것입니다. 또한 참고NSFetchRequest는 제네릭 형식입니다. 이 제네릭을 사용하면 인출 요청의 예상 반환 유형(이 경우NSManagedObject)이 지정됩니다.

  3. 페치 요청을 관리 대상 개체 컨텍스트로 넘겨 무거운 리프팅을 수행합니다. fetch(_:)은 인출 요청에 의해 지정된 조건을 충족하는 관리되는 개체의 배열을 반환합니다.
참고:save()와 마찬가지로fetch(_:)도 오류를 발생시킬 수 있으므로do블록 내에서 사용해야합니다. 페치 중에 오류가 발생한 경우catch블록 내부의 오류를 검사하고 적절하게 응답할 수 있습니다.

응용 프로그램을 빌드하고 실행합니다. 즉시,당신은 당신이 이전에 추가 한 이름의 목록을 볼 수 있습니다:

좋은! 그들은 죽은 자들로부터 돌아 왔습니다(말장난 의도). 목록에 몇 가지 이름을 추가하고 저장 및 가져 오기가 작동하는지 확인하기 위해 응용 프로그램을 다시 시작합니다. 응용 프로그램을 삭제 시뮬레이터를 재설정하거나 고층 건물에서 휴대 전화를 던지는 짧은,이름은 상관없이 테이블보기에 나타나지 않습니다.

참고:이 샘플 응용 프로그램에 몇 거친 가장자리가 있었다: 응용 프로그램 대리자에서 관리되는 개체 컨텍스트를 매번 가져와야 했습니다.

핵심 포인트

  • 핵심 데이터는 온디스크 지속성을 제공하므로 앱을 종료하거나 기기를 종료한 후에도 데이터에 액세스할 수 있습니다. 이는 앱이 포그라운드 또는 백그라운드에서 메모리에 있는 한 데이터만 저장하는 메모리 내 지속성과 다릅니다.
  • 엑스 코드는 당신이 당신의 관리 객체 모델을 만드는 데 사용할 수있는 강력한 데이터 모델 편집기와 함께 제공됩니다.
  • 관리 대상 개체 모델은 엔터티,속성 및 관계로 구성됩니다.
  • 엔터티는 핵심 데이터의 클래스 정의입니다.
  • 속성은 엔터티에 연결된 정보 조각입니다.
  • 관계는 여러 엔티티 간의 링크입니다.
  • NSManagedObject은 핵심 데이터 엔터티의 런타임 표현입니다. 키-값 코딩을 사용하여 해당 속성을 읽고 쓸 수 있습니다.
  • NSManagedObjectContext~save()또는fetch(_:)데이터가 핵심 데이터로 들어오고 나가는 것이 필요합니다.

여기서 어디로 가야합니까?

이 자습서의 맨 위 또는 맨 아래에 있는”자료 다운로드”버튼을 사용하여 이 자습서의 완성된 프로젝트를 다운로드할 수 있습니다.

이 자습서에서는 데이터 모델,엔터티,속성,관리되는 개체,관리되는 개체 컨텍스트 및 인출 요청과 같은 몇 가지 기본 핵심 데이터 개념을 이미 경험했습니다.

이 튜토리얼에서 배운 것을 즐길 경우,왜 우리의 상점에서 사용할 수있는 튜토리얼 책에 의해 전체 핵심 데이터를 확인하지?

여기 책에있는 것의 맛입니다:

1. 제 1 장,첫 번째 핵심 데이터 응용 프로그램:당신은 파일을 클릭하고 새 프로젝트를 클릭하고 처음부터 핵심 데이터 응용 프로그램을 작성합니다! 이 장에서는 데이터 모델을 설정 한 다음 레코드를 추가 및 가져 오는 기본 사항을 다룹니다.

2. 기본 데이터 저장소 클래스는 핵심 데이터 개체 그래프의 기본 데이터 저장소 클래스입니다. 이 장에서는 데이터를 저장하고 유효성을 검사하기 위해 자체 관리되는 개체 하위 클래스를 사용자 지정하는 방법을 설명합니다.

3. 제 3 장,핵심 데이터 스택:후드 아래,핵심 데이터는 함께 작동하는 많은 부분으로 구성되어 있습니다. 이 장에서는 이러한 부분이 함께 맞는 방법에 대해 배우고,자신의 사용자 정의 시스템을 구축 스타터 엑스 코드 템플릿에서 멀리 이동합니다.

4. 4 장,중간 가져 오기:앱은 항상 데이터를 가져 오며 핵심 데이터는 데이터를 효율적으로 가져올 수있는 많은 옵션을 제공합니다. 이 장에서는 고급 인출 요청,술어,정렬 및 비동기 인출에 대해 설명합니다.

5. 그리고 애플은 핵심 데이터가 그들과 잘 어울리도록 만들고 싶어한다! 이 장에서는 코어 데이터의 데이터로 인해 테이블 뷰가 백업될 때 시간과 코드를 절약할 수 있는 방법을 알아봅니다.

6. 6 장,버전 관리 및 마이그레이션:앱을 업데이트하고 향상시킬 때 해당 데이터 모델을 거의 확실하게 변경해야 합니다. 이 장에서는 여러 버전의 데이터 모델을 만든 다음 사용자가 업그레이드할 때 기존 데이터를 유지할 수 있도록 사용자를 앞으로 마이그레이션하는 방법을 알아봅니다.

7. 제 7 장,단위 테스트:테스트는 개발 프로세스의 중요한 부분이며,그 중 핵심 데이터를 떠나서는 안됩니다! 이 장에서는 핵심 데이터에 대해 별도의 테스트 환경을 설정하는 방법을 배우고 모델을 테스트하는 방법의 예를 살펴봅니다.

8. 8 장,성능 측정 및 향상: 아무도 앱이 너무 빠르다고 불평하지 않으므로 성능 추적에 대해 경계하는 것이 중요합니다. 이 장에서는 다양한 엑스 코드 도구를 사용하여 응용 프로그램의 성능을 측정 한 다음 코드의 느린 지점을 처리하기위한 몇 가지 팁을 선택하는 방법에 대해 알아 보겠습니다.

9. 9 장,관리되는 여러 개체 컨텍스트:이 마지막 장에서는 관리되는 여러 개체 컨텍스트를 포함하도록 일반적인 핵심 데이터 스택을 확장합니다. 이를 통해 인지된 성능을 개선하고 앱 아키텍처를 덜 모놀리식적이고 더 구획화된 방식으로 만드는 방법을 배울 수 있습니다.

그리고 거래를 달게하기 위해,이 책의 디지털 에디션은$44.99 에 판매 중입니다! 그러나 기다리지 않는다-이 판매 가격은 제한된 시간 동안 만 사용할 수 있습니다.

달콤한 거래의 말하기,우리는 경품에 9,000 달러 이상을 포함하여,이오스 11 출시 파티와 함께 올해 포기하고있는 큰 상품을 확인하십시오!

을 받기 위해 서 iOS12 물,모든 당신이해야 할 코멘트를 남겨서는 원래 출시를 게시,우리에게 알려 주는 책이나 물가에 당신의 마음에 드는 이 목록 또는 곧 예약 또는 물론 당신은 대부분의 흥분합니다!

우리는 당신이이 업데이트를 즐기시기 바랍니다,더 많은 책 출시 및 업데이트를 계속 지켜봐 주시기 바랍니다!

raywenderlich.com 주간

raywenderlich.com 뉴스 레터는 최신 모바일 개발자로 알아야 할 모든에 머물 수있는 가장 쉬운 방법입니다.

우리의 자습서 및 과정의 주간 다이제스트를 얻고,보너스로 무료 심층 이메일 과정을받을!

평균 평점

4.6/5

이 콘텐츠에 대한 평점 추가

로그인 평점 추가

56 평점

답글 남기기

이메일 주소는 공개되지 않습니다.