2011-02-17 7 views
111

내가 쉽게 다음 코드를 사용하여 코어 데이터에서 개체의 ID를 얻을 수 있습니다 :특정 Object ID에서 Core Data 객체를 가져 오는 방법은 무엇입니까?

NSManagedObjectID *moID = [managedObject objectID]; 

을하지만, 그것을 특정 개체의 ID를 제공하여 핵심 데이터 저장소에서 개체를 얻을 수있는 방법이 있나요? 나는이 같은 NSFetchRequest를 사용하여이 작업을 수행 할 수 있다는 사실을 알고 :

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Document" inManagedObjectContext:managedObjectContext]; 
[fetchRequest setEntity:entity]; 

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(objectID = %@)", myObjectID]; 
[fetchRequest setPredicate:predicate]; 

그러나, 나는 자신의 가져 오기 요청을 시작하지 않는 방식으로 그것을하고 싶습니다. 어떤 아이디어?

+0

그러나 가져 오기 요청 방식을 사용하면 속성이나 관계를 미리 가져 와서 속성을 설정할 수 있습니다.이 속성을 사용하면 더 많은 쿼리가 아닌 뛰어난 효율성을 얻을 수 있습니다. – malhal

답변

197

당신이 원하는 :

-(NSManagedObject *)existingObjectWithID:(NSManagedObjectID *)objectID 
            error:(NSError **)error 

는 존재하지 않는 경우 그 ID, 또는 전무를 가지고 가게에서 개체를 가져옵니다.

(주의 :.

-(NSManagedObject *)objectWithID:(NSManagedObjectID *)objectID 

...을 생성합니다 : 나를 넘어 비슷한 보이는 이름을 가진 NSManagedObjectContext에 두 가지 방법이 있습니다 바로 그들을 유지하기 위해, 여기에 다른 두가하는 일입니다 제공된 객체 ID가있는 오류 객체 과 같은 객체가 실제로 저장소에 있는지 여부. 존재하지 않으면 NSManagedObjectContext의 insertObject:으로 객체를 먼저 삽입하지 않으면 오류가 발생합니다. 개체 ID를 유지하면서 저장소에서 저장소로 개체를 복사하는 것입니다.

-(NSManagedObject *)objectRegisteredForID:(NSManagedObjectID *)objectID 

...이 managedObjectContext에 의해 저장소에서이 가져온 경우 해당 ID가 인 개체를 반환합니다. 누군가이 방법이 유용하다는 것을 아는 경우, 제발 의견을주십시오.)

[첫 번째 방법과 다른 두 가지 중요한 또 다른 중요한 차이점은 existingObjectWithID:error:이 결코 오류를 반환하지 않는다는 것입니다. 그것은 항상 당신을 위해 전체 객체를 가져옵니다. 이를 방지하려면 (예 : 큰 BLOB 속성이있는 값 비싼 가져 오기 개체로 작업하는 경우) 결함이 발생하지 않는 objectWithID: 또는 objectRegisteredForID:으로 영리해야합니다. 또는 적절히 구성된 가져 오기 요청을 사용하십시오.]

+11

'- (NSManagedObject *) objectRegisteredForID : (NSManagedObjectID *) objectID'는 객체가 컨텍스트에 이미 존재하고 그것을 가져오고 싶지 않을 때 유용합니다. – Tony

+0

내 situtation. '-tableView : didSelectRowAtIndexPath :'예/아니오가있는 UIAlertView가 표시됩니다. "예"일 경우 - 물체에 대한 작업이 있습니다. 원격에서'NSFetchedResultsController' + 백그라운드 CoreData 업데이트를 사용합니다. 따라서 개체를 저장할 수 없습니다. 경고가 화면에 표시되는 동안 저장소를 업데이트하고 개체를 제거 할 수 있습니다. objectId를 저장 한 다음 경고 위임자에서 한 번 더 검색합니다. NSFetchedResultsController를 사용하기 때문에 필요한 모든 객체가이 순간까지 이미 컨텍스트에 있습니다. 게다가, 컨텍스트에 객체가없는 경우, CoreData는 쓸모없는 인출 시도를해서는 안됩니다. – kpower

+0

좋은 대답, 고마워요! 이 메서드 이름은 정말 까다 롭습니다. 잘못된 것을 모두 망치는 것은 쉽습니다. – jackal

2

objectWithID:은 찾고있는 방법이므로이를 수행하는 것이 좋습니다. objectWithID:은 효율적으로 NSManagedObjectContext를 사용하여 필요한 다른 여러 수준과 달리 개체를 여러 수준으로 가져옵니다. objectWithID:은 보조 저장소로 이동하기 전에 상위 컨텍스트의 영구 메모리 내 정보, 영구 저장소 조정자 및 영구 저장소 자체를 올바르게 사용합니다.

이 내용은 WWDC 2012 세션의 "핵심 데이터 모범 사례"에서 자세히 다룹니다.

관련 문제