2011-02-23 3 views
3

많은 텍스트 파일을 구문 분석하고 해당 내용을 관리되는 개체로 구성하려고합니다. 텍스트 파일에는 많은 중복이 있으므로 "부수적 인"작업 중 하나는 해당 텍스트 파일을 제거하는 것입니다.CoreData, NSManagedObject 가져 오기 또는 만들기 존재하지 않는 경우

이 점에 관해서는 주어진 콘텐츠가있는 엔티티가 있는지 여부를 확인하고 그렇지 않은 경우 엔 만들어야합니다. 그러나, 나는 다른 속성과 관계를 가진 다른 엔티티 있습니다. 내가 원하는 것은 여러 속성을 입력으로 사용하여 새로운 NSManagedObject 인스턴스를 반환하는 일종의 함수입니다. 데이터 저장소에 삽입하거나 가져온다면 걱정할 필요가 없습니다.

하나 있습니까?

나는 또한 핵심 데이터에 멍청하다고 말해야합니다.


좀 더 상세하게는, 당신이 원하는 경우에 : 나는 사전의 종류를 쓰기 위해 노력하고 있어요

. 규칙 (규칙 {는 NSString 이름, < - >> 워드 워드, < < -> PartOfSpeech partOfSpeech, < < -> 엔딩 결말}), 부품 - 난 (워드 {> 규칙 규칙는 NSString * 단어, < <}) 단어가 (PartOfSpeech {NSString name, < < -> 규칙 규칙}) (표기법이 명확하면 좋음).

두 단어가 같은 단어 속성을 갖고 동일한 규칙에 "링크 된"경우 두 단어가 동일합니다. 두 규칙은 동일한 결말과 일부 내용이있을 경우 동일합니다.

지금까지 NSPredicate, NSManagedObjectContext 및 NSEntityDescription을 입력으로 사용하는 메소드를 작성한 후 데이터 스토어를 먼저 쿼리하고 항목을 찾거나 새로운 것을 작성한 후 데이터 스토어에 삽입하고 리턴하는 엔티티를 리턴합니다 그것. 그러나이 경우에는 새 엔티티에 (해당 메소드 내에서) 필요한 데이터를 채울 수 없으므로 NSDictionary에 특성 이름과 값을 전달하고 삽입하거나 참조로 플래그를 반환해야합니다. 새 개체를 만들거나 이전 개체를 반환하므로 외부 데이터로 채울 수 있습니다.

그러나보기 흉한 것 같습니다. 그보다 더 우아한 뭔가가 있어야한다고 확신합니다. 단지 찾지 못했습니다. 가능하다면 도와주세요.

답변

3

기본적으로 올바른 경로에 있습니다. 핵심 데이터는 객체 그래프입니다. 역동적 인 것이 많지 않습니다. 또한 "업서 트"도 없습니다. 당신이 추측하는 것처럼, 당신은 가져와야하고 존재하지 않는다면, 당신은 하나를 삽입해야합니다.

1

다음은 가져 오기 또는 만들기 시나리오를 처리하기 위해 방금 시작한 것입니다. 하위 개체에 대한 다 대다 관계를 포함하는 최상위 관리 개체를 사용하고 있습니다. 몇 가지 데이터 배열이 들어있는 클래스가 있습니다 (여기에는 표시되지 않음). 이 클래스는 핵심 데이터간에 저장 및 검색을 담당합니다. 클래스가 생성 될 때, 나는 최상위 레벨 NSManagedObject에 접근하기 위해 fetch-or-create를 수행한다.

@implementation MyDataManagerClass 

... 

@synthesize MyRootDataMO; 

- (MyDataManagerClass *) init { 

    // Init managed object 

    NSManagedObjectContext *managedObjectContext = [(MyAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]; 

    // Fetch or Create root user data managed object 

    NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"MyRootDataMO" inManagedObjectContext:managedObjectContext]; 
    NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease]; 

    [request setEntity:entityDescription]; 

    NSError *error = nil; 
    NSArray *result = [managedObjectContext executeFetchRequest:request error:&error]; 

    if (result == nil) { 
     NSLog(@"fetch result = nil"); 
     // Handle the error here 
    } else { 
     if([result count] > 0) { 
      NSLog(@"fetch saved MO"); 
      MyRootDataMO = (MyRootDataMO *)[result objectAtIndex:0]; 
     } else { 
      NSLog(@"create new MO"); 
      MyRootDataMO = (MyRootDataMO *)[NSEntityDescription insertNewObjectForEntityForName:@"MyRootDataMO" inManagedObjectContext:managedObjectContext]; 
     } 

    } 

    return self; 

} 

... 
+0

작은 데이터 세트에서는 효과적이지만 더 큰 데이터 세트 (예 : 사전 또는 동의어 사전)로 확장하면 매우 효율적입니다. –

+0

이것은 6 세 코드입니다. 나는 그것이 무엇을위한 것인지 기억하지 못한다. 그러나 그것의 init에서 오직 실행되도록 작성되었다. 표면 상 이는 단일 호출 초기화 기 (singleton initializer)에서 앱을 시작할 때 한 번만 호출하고 관리 객체 트리에 대한 단일 진입 점에 대한 액세스 권한을 부여하기 위해 사용됩니다.그런 다음 클래스를 확장하여 핵심 데이터에 대한 외관을 생성 할 수 있습니다. – Michael

+0

낡은 질문에 대한 낡은 답변 및 프로덕션 코드보다 더 많은 기술 데모. OP는이 솔루션이 적절하지 않은 대규모 데이터 디자인 패턴에 대해 질문하고 있습니다. 큰 데이터 세트에는 적합하지 않습니다. 작은 데이터 세트에서이 기법을 직접 사용해 보았습니다. 큰 데이터 세트 (예 : 10,000 레코드)의 경우 삽입/업데이트 전에 멤버를 결정하기 위해 가져온 엔티티 데이터의 NSSet을 사용합니다. –

관련 문제