2011-09-19 6 views
4

관리 대상 객체의 고유 ID를 얻는 방법이 있다는 것을 알았습니다.핵심 데이터 : 고유 객체 ID 저장

NSManagedObjectID *moID = [managedObject objectID]; 

그러나 읽었을 때 저장 될 때 변경됩니다.

내 고유 ID를 만들고 각 개체에 저장하는 더 좋은 방법은 무엇이며 고유하고 변경되지 않는 것은 무엇입니까?

답변

6

내 개체에 만든 날짜 속성이 있으므로 초를 포함하여 그 날짜를 사용하게되었습니다. 내가 원하는 방식으로 일해라.

+1

이것은 나에게 일을하는 어지러운 방법처럼 보입니다. 블록을 사용하여 그것을 저장하고 원래 managedObjectContext에 대한 포인터를 갖는 다음 서버 측 식별을 설정하는 것은 훨씬 더 깔끔합니다. – Rambatino

+0

가능한 한 많은 문제가 있습니다. 앱의 여러 인스턴스가 동시에 (최대 두 번째까지) 객체를 생성하고 그 객체가 서버 측에 업로드되면 ID가 충돌합니다. 그렇지 않으면, 간단한 (비록 조금 빠른 'n'더티) –

3

GUID을 사용하여 init 동안 개체에 대한 ID 필드를 만들고 채울 수 있습니다. GUID을 만들고 선택적으로 문자열로 내보내는 방법을 참조하십시오. UUID (GUID) Support in Cocoa

+0

'id', 'description'등과 같은 이름을 가진 객체 속성을 호출하지 마십시오. –

12

CoreData 엔티티에 NSManagedObjectID를 저장할 수 없으며 정수 또는 문자열 ID로 사용할 수있는 속성이 없습니다. 따라서 고유 한 식별자 알고리즘을 만드는 것이 용인 될 수 있습니다. 엔티티가 저장 될 때 추적 할 수 없다면 일부 응용 프로그램에서이 작업을 수행합니다.

예를 들어 UITableView 셀에 엔티티에 대한 채우기가 필요할 때와 비슷한 셀을 클릭하거나 엔티티를 검색해야 할 때가있었습니다.

uri 표현을 사용하여 제안을 발견했지만 전에 컨텍스트를 저장해야했지만 NSFetchedResultsController를 사용하여 응용 프로그램 빌드 ID보다 더 견고한 솔루션을 발견했습니다.

[[myManagedObject objectID] URIRepresentation]; 

그런 다음 나중에 관리 개체 ID 자체 검색 할 수 있습니다

NSManagedObjectID* moid = [storeCoordinator managedObjectIDForURIRepresentation:[[myManagedObject objectID] URIRepresentation]]; 

을 그리고 moid와 나는 당신의 관리 객체를 검색 할 수 있습니다.

1

가이 검색 다른 사람이 도움이된다면, 이것은 내가 할 방법은 다음과 같습니다

객체

상의 ID 속성을 만들고이 코드와 객체를 생성 할 때 마지막으로 사용 된 ID를 가져옵니다 :

Playlist *latest; 

// Define entity to use and set up fetch request 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Playlist" inManagedObjectContext:managedObjectContext]; 
NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
[request setEntity:entity]; 


// Define sorting 
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"listID" ascending:NO]; 
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; 
[request setSortDescriptors:sortDescriptors]; 


// Fetch records and handle errors 
NSError *error; 
NSArray *fetchResults = [managedObjectContext executeFetchRequest:request error:&error]; 

if (!fetchResults) { 
    NSLog(@"ERROR IN FETCHING"); 
} 

if ([fetchResults count] == 0) { 
    latestID = 0; 
} else { 
    latest = [fetchResults objectAtIndex:0]; 
    latestID = latest.listID; 
} 

새 개체에서 1 씩 증가시킵니다.