2012-03-11 2 views
9

문제가 생겼습니다.iOS 5에서 핵심 데이터가 중복되는 것을 방지하려면 어떻게해야합니까?

주말 동안 저는 웹 서비스에서 큰 xml을 가져 오는 프로젝트를 진행해 왔습니다.

기본적으로 3 계층 - 클라이언트, 관리자, 직원 모두 계층 적입니다. 따라서 앱을 처음 실행하면이 XML을 가져 와서 구문 분석하여 3 개의 관련 엔터티 (클라이언트, 관리자 및 직원)의 모든 항목을 만듭니다.

앱이 시작될 때마다 동일한 XML을 아래로 가져와야하지만 이번에는 변경된 기존 레코드 만 업데이트하거나 새로운 클라이언트, 관리자 또는 직원을 위해 새 레코드를 추가하기 만하면됩니다. 지난번 이후로 나타났습니다.

그래서 지금까지 말했듯이, 모든 것을 당기고 올바르게 구문 분석하고 올바른 항목을 만들고 모든 특성을 채 웁니다. 이 모든 데이터를 복제하는 것 2 출시에

그러나, 데이터 변경과 함께, - 그래서 대신에 15 클라이언트 (정확한 숫자를) 나는 30가 등등 ...

는 정말해야합니까 내 구문 분석에 새로운 NSManagedObject를 생성하는 대신 이미 이미 있는지 확인하기 위해 많은 코드를 추가하십시오.

만약 그렇다면 모든 속성을 수동으로 확인해야합니까?

정말 고통스럽고 오래갑니다. 코어 데이터가 저에게 이런 종류의 일을 자동으로하도록 만드는 방법이 아닙니까?

도움이나 제안을 해주셔서 감사합니다.

답변

3

애플 문서에 명시된 바와 같이이 https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdImporting.html

당신은 루프에 데이터 모델을 필요로하고이

예처럼 거기에서 그것을 처리 :

// loop over employeeIDs 
// anID = ... each employeeID in turn 
// within body of loop 

NSString *predicateString = [NSString stringWithFormat: @"employeeID == %@", anID]; 

NSPredicate *predicate = [NSPredicate predicateWithFormat:predicateString]; 

개인적으로 나는 이 방법을 사용하면이 효율적인 스 캐노피에서 이것을 처리하고 곧장 앞으로 나아갈 수있는 코드 스 니펫을 작성했습니다. 나는 Apples 메서드를 사용하여주의 문자와 공백 같은 다른 문자가있는 문자열 문제를 발견했습니다. 아래의 코드는 테스트하고 작동하는 모든 해당 개체의 이름을 올바르게 변경하면 솔직히 이것이 코어 데이터에 중복을 추가하지 않는 가장 효율적인 방법이라고 생각합니다.

-(void)AvoidDuplicatesinDataModel 
{ 
    // Define our table/entity to use 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Users" 
               inManagedObjectContext:managedObjectContext]; 

    // Setup the fetch request 
    NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
    [request setEntity:entity]; 

    // Define how we will sort the records 
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"users" 
                    ascending:NO]; 
    NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor]; 

    [request setSortDescriptors:sortDescriptors]; 
    [sortDescriptor release]; 

    // Fetch the records and handle an error 
    NSError *Fetcherror; 
    NSMutableArray *mutableFetchResults = [[managedObjectContext 
              executeFetchRequest:request error:&Fetcherror] mutableCopy]; 

    if (!mutableFetchResults) { 
     // Handle the error. 
     // This is a serious error 
    } 

    //here usersNameTextField.text can be any (id) string that you are searching for 
    if ([[mutableFetchResults valueForKey:@"users"] 
     containsObject:usernameTextField.text]) { 
     //Alert user or handle your duplicate methods from here 
     return; 
    } 
} 
+0

왜 가져 오기에 대한 변경 가능한 복사가 발생합니까? – dmur

12

DB를 스스로 깨끗하게 유지해야 할까 두려워 ... 가장 쉬운 방법은 NSFetchRequest입니다. 업데이트 된 데이터를 가져올 때 기존 데이터에 대해 쿼리를 실행하고 수행 할 작업을 결정할 수 있습니다. 마커스 S. Zarra으로

이 주제에 대해 another thread에서 언급 :

새 행 당신이이 이미 있는지 확인하기 위해 기존 행에 대해 쿼리를 실행할 수를 가져

. 이렇게하려면 당신은 당신의 실체에 대해 에게 NSFetchRequest를 생성, 최대 열이 나는 당신의 가져 오는 동안 주변이 NSFetchRequest을 유지하는 것이 좋습니다 것 1.

로 돌아 의 GUID 속성을보고 설정하는 조건을 설정 할 수 있도록 가져 오기를 진행하는 동안 다시 사용하십시오. NSFetchRequest가 행을 반환하면 해당 행을 업데이트 할 수 있습니다. 행을 반환하지 않으면 새 행을 삽입 할 수 있습니다.

올바르게 실행하면 이상의 성능을 사용할 수 있습니다.

좋은 정보의 또 다른 원천 사과 프로그래밍 가이드 : Core Data Programming Guide

+0

그래, 나는 생각했다. – iOSProgrammingIsFun

+0

@iOSProgrammingIsFun 내 게시물이 도움이 되었다면 받아 들일 수 있습니다. :) – dom

+1

링크가 죽었습니다. – Besi

관련 문제