2012-05-23 5 views
13

Stanford 193P 아이튠즈의 아이튠즈 코스에서 핵심 데이터 강좌에서 강사는 NSPersistentStoreCoordinator을 사용하지 않고 코어 데이터가있는 샘플 프로젝트를 코딩하여 NSManagedObjectModel으로로드했습니다. 그러나 다른 코드 샘플과 iPhone 개발에 관한 Big Nerd Ranch 서적을 보면, 그들은 NSManagedObjectModel과 PersistentStoreCoordinator를 만들고 그런 식으로 NSManagedObjectContext을 설정하고 있습니다.NSPersistentStoreCoordinator를 사용하는 지점은 무엇입니까?

내 질문은 이런 식으로하는 것이 무엇이며, 두 접근법의 장단점은 무엇입니까?

답변

18

나는 같은 강연 시리즈를 매우 밀접하게 따랐다. 이 특정 예제는 Flickr에서 데이터 (사진 작가 및 사진)를 가져와 CoreData에로드합니다. 이 응용 프로그램에서 CoreData를 사용할 필요는 없었습니다. 왜냐하면 모든 응용 프로그램로드시 flickr에서 새 데이터를 가져와야하기 때문에 지속적으로 절약 할 필요가 없습니다. Professor는 학생들이 이미 CoreData에 익숙해 졌기 때문에 이전 데모에서 시작한 flickr 가져 오기 앱을 시작점으로 사용했습니다. 그러나 릭스터가 언급했듯이 디스크에 컨텍스트를 저장하지 않고 코어 데이터를 사용하면 큰 이점이 있습니다.

바울이 데모 전에 강의에서 설명하고있는 바와 같이, 핵심 데이터베이스 중 하나에 의해 (iOS5를에서) 만들 수 있습니다 : 새 프로젝트를 만들 때 응용 프로그램 템플릿

  1. 클릭 "사용의 핵심 데이터".

첫 번째 방법 뒤에 아이디어를 UIManagedDocument을 사용는

  • 엑스 코드는 사용자의 문서 디렉토리/영구 저장소 코디네이터/모델을 설정하는 AppDelegate에 코드를 잔뜩 넣어 것입니다. 그런 다음 관리 대상 객체 CONTEXT를 초기보기 컨트롤러 (공개 API에 NSManagedObjectContext 속성이 있어야 함)로 전달하고 다른 뷰 컨트롤러와 연결될 때 맥주 병처럼 컨텍스트를 전달할 수 있습니다. 컨텍스트를 전달하는 것은 핵심 데이터베이스에 액세스하는 올바른 절차입니다.

    UIManagedDocument 사용은 AppDelegate 만 남겨둔 경우를 제외하고는 매우 유사합니다. 앱의 문서 디렉토리에있는 URL 경로를 사용하여 UIManagedDocument (초기보기 컨트롤러에서)를 만들 수 있습니다 (참고 : 파일이 이미 존재하고 존재하지만 열리지 않았는지 또는 존재하지 않는지 수동으로 확인해야합니다). 그런 다음 위와 같은 방법으로이 문서의 컨텍스트를 사용할 수 있습니다.

    또 다른 참고 사항 : AppDelegate에서 컨텍스트에 대한 포인터를 만들어 앱이 충돌하거나 종료 될 때 컨텍스트를 명시 적으로 저장할 수 있도록하는 것이 좋습니다.

    영구 저장소 조정자는 자동으로 설정되며 persistentStoreOptions 속성을 사용하여 구성 할 수 있습니다. 실제로는 컨텍스트를 영구히 저장해야하거나 UIManagedDocument를 서브 클래 싱하고 원하는 메서드를 재정의해야합니다.

    이 두 방법은 같은 방식으로 작동하고, 동일한 제어 및 액세스를 제공 UIManagedDocument 문서 http://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UIManagedDocument_Class/Reference/Reference.html

    의 개요를 읽어보십시오. UIManagedDocuments를 사용하면 여러 sqlite 파일에 여러 개의 데이터베이스를 만들 수 있습니다. 필요할 때까지 데이터베이스를 만들거나 설정할 때까지 기다릴 수도 있습니다. "코어 데이터 사용"옵션은 응용 프로그램로드시 설정하는 단일 코어 데이터베이스를 제공하며, AppDataele에 CoreData를 중앙 집중화하고, 코딩 시간을 절약하며, 빠른 트랙 응용 프로그램에 유용합니다. 나는 UIManagedDocument를 좋아한다.

    핵심 데이터 옵션을 선택하지 않고 시작한 AppData를 AppDelegate에 추가하려는 경우 핵심 데이터가 선택된 새 프로젝트를 만들고 모든 코드를 AppDelegate에 복사하십시오 (단지 3 개의 속성과 해당 접근자가 있어야 함). 문서 디렉토리에 액세스하는 편리한 방법). 초기 뷰 컨트롤러, 모델 등을 가리켜 야합니다.

    업데이트 : 다른 편의를 추가하고 싶습니다. 관리되는 개체 컨텍스트가 AppDelegate에 저장되어있는 경우, 당신은 단지 그것을 주변에 통과

    NSManagedObjectContext* context = [[(AppDelegate*) [UIApplication sharedApplication] delegate] myManagedObjectContext]; 
    

    이 가진 부정를 사용하여 어디에서나 응용 프로그램에 액세스 할 수 있습니다.

    CoreData 앱의 경우 모델을 변경하는 경우 다시 작성하기 전에 시뮬레이터에서 앱을 수동으로 삭제해야합니다. 그렇지 않으면 이전 파일을 사용할 것이므로 다음 빌드에서 오류가 발생합니다.

  • +0

    그 장황한 해답을 바탕으로 AppDelegate에 백 포인터를 사용하여 어디서든 컨텍스트를 잡을 수는 있지만 선호하지는 않습니다. – Patrick

    +0

    절대적으로 화려한 대답. 여기에 UIManahegDocument를 저장하는 코드 스 니펫이 있습니다. [document saveToURL : document.fileURL forSaveOperation : UIDocumentSaveForOverwriting completionHandler : NULL]; – brainray

    7

    영구 저장소 코디네이터가 없으면 결과를 영구 영역 (데이터베이스, 파일 등)에 저장할 수 없으므로 영구 데이터 관리자가 전혀 쓸모가 없도록하려면 NSPersistentStoreCoordinator를 생략하십시오. 프로젝트에서 사용하지 않았다고 확신합니까? 교수가 데이터를 어떻게 저장 했습니까? 새 핵심 데이터 프로젝트를 만들면이 논리가 자동 생성됩니다.

    EDIT : 교수님이 UIManagedDocument을 사용하고 있습니다. 내부적으로 파일 유형을 기반으로하는 자체적 인 영구 저장소 코디네이터를 사용하므로 명시 적으로 만들 필요가 없습니다 (단, 해당 파일 형식에 만족하지 않는 한). 태만). 결국 코디네이터를 사용할 지 여부에 대한 것이 아니라 명시 적으로 만들지 여부입니다.

    +0

    나는 교수가 그것을 사용하지 않았을 것이라고 확신하지만 [NSEntityDescription insertNewObjectForEntityForName]을 사용하여 핵심 데이터에 객체를 저장하고 있었다. 논리가 자동으로 생성되는 위치는 어디입니까? 덕분에 – user1337645

    +0

    당신의 App Delegate에서 나는 믿습니다. 컨텍스트에서 "저장"을 호출 할 때 사용할 저장소 코디네이터를 설정합니다. 만약 그가 그 기능을 사용하지 않았다면 Core Data를 왜 귀찮게하는지 ... 궁금합니다. – borrrden

    +0

    핵심 데이터는 작동하기 위해서 관리 객체 컨텍스트, 관리 객체 모델 및 영구 저장 코디네이터가 필요합니다. (당신이 참조하는'insertNewObject ...'메소드는 컨텍스트를 매개 변수로 사용하고 컨텍스트는 저장소가 필요하며 저장소는 모델이 필요합니다.) 강의에서 보았던 것은 템플릿 프로젝트의 사용이었습니다. 새로운 Xcode 프로젝트를 만들고 "핵심 데이터 사용"을 선택하면, AppDelegate 구현은이를 설정하기위한 보일러 플레이트 코드를 얻습니다. – rickster

    관련 문제