2010-11-18 1 views
5

문서 기반 코어 데이터 애플리케이션이있는 것처럼 보입니다. 항목 라이브러리를 보유하기 위해 전역 영구 저장소에 대한 지원을 추가하고 싶습니다.코어 데이터 글로벌 영구 저장소를 사용하는 문서 기반 애플리케이션

관련 문서의 대부분을 읽었으며 관리 대상 개체 모델에서 구성을 사용해야한다는 것을 알고 있습니다. "DocumentConfiguration"과 "LibraryConfiguration"의 두 가지 구성을 정의했습니다. 문서 구성의 엔티티는 문서 구성에만 있고 라이브러리 구성의 엔티티는 라이브러리 구성에만 있습니다 (즉 겹치지 않음).

그러면 "코디네이터를 만들 때이 모델을 사용합니다"라고 말합니다. 그러나 기본 NSPersistentDocument 코디네이터를 사용하고 있으므로 영구 저장소 코디네이터를 실제로 만들지는 않습니다.

진행하고 오해를 정리하는 방법에 최고에 대한 몇 가지 질문 나는이있을 수 있습니다

A. 내가 NSPersistentDocument에 NSPersistentStoreCoordinator을 획득하고 다음의 라인을 따라 해 새로운 영구 저장소를 추가합니다 :

NSPersistentStoreCoordinator * coordinator = [[myDocument managedObjectContext] persistentStoreCoordinator]; 
[coordinator addPersistentStoreWithType:NSXMLStoreType 
    configuration:@"LibraryConfiguration" 
    URL:url 
    options:nil 
    error:&error]; 

것은 내가 NSPersistentDocument에서 제공하는 기본값을 사용하고 나는이 NSPersistentDocument의 영구 저장소 코디네이터의 다른 구성 정의 ("DocumentConfiguration")를 제공하지 않았기 때문에이 문제가 될 수 있다고 생각 해요. 문서를 저장할 때가 왔을 때 아마 nil을 사용할 것이라고 추측합니다. 그렇다면 이것이 문제가 될까요? 즉, 동일한 구성이 모든 영구 저장소 (이 경우 두 개)에 대해 정의되지 않은 경우 코디네이터는 주어진 구성 정의가있는 엔티티를 저장할 영구 저장소를 어떻게 알 수 있습니까? NSPersistentDocument의 영구 저장소가 생성/저장되기 전에 구성 ("DocumentConfiguration")을 설정할 수 있습니까? NSPersistentDocument의 문서에서 :

Saving a new document adds a store of the default type with the chosen URL and invokes save: on the context. For an existing document, a save just invokes save: on the context.

B. 정의 된 구성을 가진 두 개의 영속 매장을 추가, 내 자신 NSPersistentStoreCoordinator 및 NSManagedObjectContext 인스턴스를 만든 다음 NSPersistentDocument이 NSPersistentStoreCoordinator 및 NSManagedObjectContext 인스턴스를 사용하도록하고, 무료로하는 것이 더 있을까 오래된 것들? 그렇다면 어떻게 addPersistentStoreWithType : ... 메소드에 대한 NSPersistentDocument의 URL을 지정하겠습니까? 제목없는 문서가 저장된 후에 만이 URL을 알 수 있습니다. (이것을 테스트 할 때, 문서가 처음 저장 될 때까지 영속 저장소 조정자에 persistentStores 메소드를 통해 임시 저장 저장소가없는 것으로 나타납니다).

C. 또는 NSPersistentDocument 만 그대로두고 영구 라이브러리 저장소와 관리되는 라이브러리 개체 모델에 독점적으로 사용하는 자체 NSPersistentStoreCoordinator 인스턴스를 만드는 것이 좋습니다. 문서에서는 다중 스레드 코어 데이터 응용 프로그램에서 NSPersistentStoreCoordinator의 여러 인스턴스를 사용해야하지만 다중 스레드 코어 데이터 지원은 필요하지 않습니다. NSPersistentStoreCoordinator의 두 인스턴스를 갖는 것이 바람직합니까? 하나는 라이브러리 용이고 하나는 문서 용입니다 (직관은 이것이 필요하지 않고 올바른 접근이 아니라고 말합니다).

제안 사항?

답변

1

내가 잘 사용하는 솔루션은 위의 C)를 기반으로합니다. NSPersistentDocument는 그대로두고 영구 저장소 코디네이터 만 있고 대신 영구 라이브러리 저장소 (전역 저장소)에 독점적으로 사용하는 자체 NSPersistentStoreCoordinator 인스턴스를 만듭니다.

나중에이 영구 저장소 조정자와 연결된 여러 저장소 (예 : "LibraryConfiguration")를 원할 경우를 대비하여 저장소의 구성을 사용자 지정 값으로 설정할 수 있습니다. 라이브러리 저장소는 NSPersistentDocument의 영구 저장소 코디네이터와 다른 영구 저장소 조정자가 관리하므로 NSPersistentDocument의 영구 저장소에 대한 구성을 지정하지 않아도됩니다.

0

각 구성마다 별도의 영구 저장소를 만들어야합니다. 이것이 동일한 데이터 모델의 다른 엔티티를 별도의 영구 파일로 저장할 수 있도록하는 구성입니다.

일반적인 실수는 영구 저장소 조정자가 임의의 수의 영구 저장소를 가질 수 있다는 것을 잊어 버리는 것입니다.Apple의 상용구를 복제하여 서로 다른 이름 및/또는 위치와 각각이 다른 구성 이름을 가진 두 개의 영구 저장소를 만드는 것뿐입니다. 그런 다음 둘 모두를 지속적 저장소 코디네이터에 추가하십시오.

그리고 끝났습니다. 각 구성에 대한 엔티티 인스턴스가 올바른 저장소로 이동합니다.

+0

그러나 NSManagedObjectContext에 대한 설명서에는 영구 저장소 코디네이터를 가져 오거나 설정하는 메서드 만 있으며 추가 할 수는 없습니다. 즉, 내 이해에서 관리 대상 객체 컨텍스트와 연결된 둘 이상의 영구 저장소 조정자를 가질 수는 없습니다. 관리 객체 컨텍스트와 연결된 영구 저장소 조정자는 여러 영구 저장소를 관리 할 수 ​​있지만 그 차이는 다릅니다. – Dalmazio

+0

미안하지만, 나는 썼다. 'addPersistentStoreWithType : configuration : URL : options : error :' – TechZen

+0

으로 영구 저장소 코디네이터에 여러 저장소를 실제로 추가합니다. 그래도이 상황에서는 문제가 계속됩니다 (전역 영구 저장소와 문서 기반 저장소 응용 프로그램)에서 위의 A)에서 설명한대로 NSPersistentDocument의 영구 저장소 조정자에서 addPersistentStoreWithType : ...을 호출합니다. – Dalmazio