2012-06-14 3 views
1

하나의 셀에서 ID와 이름을 가져 오는 코드가 있습니다. 그런 다음 행을 선택하면이 선택 사항을 저장하고 핵심 데이터로 보내야합니다. 예를 들면 : 이미 도시가있는 경우 중복 된 이름 .. 어떻게 추가 할 수 있습니까?코어 데이터가 이미 값을 갖고 있는지 확인하는 방법은 무엇입니까?

AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; 

NSManagedObjectContext *context = [appDelegate managedObjectContext]; 
NSManagedObject *villesR = [NSEntityDescription 
            insertNewObjectForEntityForName:@"Ville" 
            inManagedObjectContext:context]; 


[villesR setValue:idVille forKey:@"idV"]; 
[villesR setValue:nomville forKey:@"nom"]; 

[self.navigationController pushViewController:detailView animated:YES]; 

답변

7

Tidane,

당신이 개체가 이미 존재 여부, 당신이 가져 오기 요청을 설정하고 특정 조건을 사용해야 할 경우 확인해야

. 귀하의 경우에는 Ville에 대해 간단한 가져 오기를 수행하고 idV이 이미 있는지 확인할 수 있습니다. 나는 idV이 귀하의 Ville에 대한 식별자와 같다고 생각합니다. nom을 확인하는 것은 같을 수 있지만 세계의 두 곳에서 같은 이름을 가진 두 개의 cities을 가질 수 있습니다.

@alpz 해결책은 정상입니다. 또한 당신은 또한 1로 fecth 제한을 설정할 수 있습니다 : 그렇지 않으면

[request setFetchLimit:1]; 

를 사용하면 간단하게

NSUInteger count = [context countForFetchRequest:request error:&error];  
if(count == 0) { 

    // add the new city here 
} 

대신

NSArray *results = [context executeFetchRequest:request error:nil]; 

@Phillip 밀스의 당신이 할 수 있다고 말하고있다 할 수 키 값 코딩 액세스 대신 NSManagedObject 하위 클래스를 사용하십시오. 일반 문자열 키 대신 클래스의 속성을 사용하는 것이 더 쉽다고 생각합니다. 당신이 Ville 서브 클래스 (organising-core-data-for-ios)를 만든 후에

그래서, 당신은 단지 Ville+Extension라고 그것을 위해 카테고리를 만들 수 있고, 다음과 같은 방법을 만들 : 다음

+ (Ville *)villeWithUniqueName:(NSString *)name withManagedObjectContext:(NSManagedObjectContext*)context 
{ 
    NSFetchRequest * request = [[NSFetchRequest alloc] init]; 
    [request setEntity:[NSEntityDescription entityForName:@"Ville" inManagedObjectContext:context]]; 
    [request setPredicate:[NSPredicate predicateWithFormat:@"nom = %@", name]; 
    [request setFetchLimit:1]; 

    NSArray *results = [context executeFetchRequest:request error:nil];   

    Ville* theVille = nil; 

    if ([results count] == 0) 
    { 
     theVille = // create the new here 
    } 
    else 
    { 
     theVille = (Ville*)[results objectAtIndex:0]; 
    } 

    [request release]; // if you don't use ARC 

    return theVille; 
} 

, (해당 범주를 사용 수입 후) :

Ville* theVille = [Ville villeWithUniqueName:@"yourName" withManagedObjectContext:yourContext]; 

희망이 있습니다.

+0

대단히 고마워 ... 마침내 생각이났다. :) – Tidane

+0

@Tedane 오신 것을 환영합니다.건배. –

1

저장하기 전에 핵심 데이터를 확인해야합니다. 이것은 내가 같은 상황을 어떻게 처리했는지입니다.

NSFetchRequest * request = [[NSFetchRequest alloc] init]; 
NSManagedObjectContext* context=[Server serverInfo].context; 
[request setEntity:[NSEntityDescription entityForName:@"Coupon" inManagedObjectContext:context]]; 
[request setPredicate:[NSPredicate predicateWithFormat:@"Upc=%@",[[ar objectAtIndex:i]valueForKey:@"upc_code"]]]; 
NSArray *results = [context executeFetchRequest:request error:nil]; 
[request release]; 

if ([results count] == 0) 
{ 
    //core data does not have an entry with the upc code(in my case) that i am searching 
} 
else 
{ 
    // core data have already an entry with that upc code 
} 

이 결과 배열에는 해당 항목이 있는지 여부가 표시됩니다. 당신이 어떤 질문이라도 있으면 알려주세요 .. 불행한 코딩!

+ (City *)cityWithUniqueName:(NSString *)name; 

거기에서, 당신은 이름을 가진 기존의 코어 데이터 객체를 조회하고 반환 :

+0

발견했습니다.하지만 빈 행을 추가하고 ... 너무 많이 가져 가지 않습니다. S – Tidane

+0

배열 수가 0 인 경우에만 항목을 추가하는 코드를 수행합니다. –

0

가장 좋은 방법은 도시 수업과 같은위한 클래스 메소드를 만들 아마. 발견되지 않으면 insertNewObjectForEntityForName을 사용하여 하나 만들고 다시 돌려 보냅니다.

+0

나는 그것을 시각화 할 수있다. 그러나 나는 정말로 잃어버린다. idV와 이름을 가진 클래스 시티를 만든다. 나는 그 모든 가져 오기를 만든다. – Tidane

관련 문제