2013-03-06 4 views
5

핵심 데이터에 개체를 추가하려고했습니다. 그래서, 핵심 데이터 저장소에 중복 항목을 허용하지 않아야합니다. 그렇게하는 방법? 이것은 데이터 저장 관련 코드입니다.핵심 데이터에 중복 항목을 제한 할 수있는 방법이 있습니까?

-(IBAction)save:(id)sender 
    { 

     if([name.text isEqualToString:@""] && [address.text isEqualToString:@""] && [phone.text isEqualToString:@""]) 
     { 

      UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Yo..!" 
                 message:@"Data Not Saved" 
                 delegate:nil 
               cancelButtonTitle:@"OK" 
               otherButtonTitles:nil]; 
      [alert show]; 
     } 
    else 
    { 
     coreDataAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; 

     NSManagedObjectContext *context = [appDelegate managedObjectContext]; 


     NSManagedObject *newContact; 
     newContact = [NSEntityDescription 
         insertNewObjectForEntityForName:@"Contacts" 
         inManagedObjectContext:context]; 


     [newContact setValue:name.text forKey:@"name"]; 
     [newContact setValue:address.text forKey:@"address"]; 
     [newContact setValue:phone.text forKey:@"phone"]; 


     name.text = @""; 
     address.text = @""; 
     phone.text = @""; 

     NSError *error; 
     [context save:&error]; 

     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Yo..!" 
                message:@"Data Saved" 
                delegate:nil 
              cancelButtonTitle:@"OK" 
              otherButtonTitles:nil]; 
     [alert show]; 

     NSLog(@"Object Saved\n"); 

    } 


} 
+0

저장하는 동안

https://developer.apple.com/library/content/samplecode/ThreadedCoreData/Introduction/Intro.html

는 확인합니다. 기존의 경우 그냥 업데이트. 새 항목을 만들고 DB에 저장하지 않으려면 – Meera

답변

6

에 사용자 정의 할 수있는 코드를 제공합니다. 이 당신을 도울 수

-(void)checkForDuplicates 
{ 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Students" 
              inManagedObjectContext:managedObjectContext]; 

    NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
    [request setEntity:entity]; 

    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"students" 
                   ascending:NO]; 
    NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor]; 

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

    NSError *Fetcherror; 
    NSMutableArray *mutableFetchResults = [[managedObjectContext 
             executeFetchRequest:request error:&Fetcherror] mutableCopy]; 

    if (!mutableFetchResults) { 
     // error handling code. 
    } 

    if ([[mutableFetchResults valueForKey:@"users"] 
     containsObject:name.text]) { 
     //notify duplicates 
     return; 
    } 
    else 
    { 
     //write your code to add data 
    } 
} 

희망 : 여기

는 코드입니다!

+0

감사합니다. :)이 빠른 해결 방법과 술어 사용 사이에있었습니다. –

+0

새로운 데이터를 원할 때마다 엔티티에서 컨텐츠를 삭제하고 새로운 데이터를 삽입하십시오. –

2

아니요, coredata는 DB가 아니므로 고유로 내장되어 있지 않습니다.


귀하는 프로그램 논리에서 고유성을 보장해야합니다.

고유해야하는 항목을 가져오고, 가져 오기에 1 항목이 있으면 다른 항목을 추가하지 말고 추가하십시오.

==>이 직렬 CD 액세스를 위해 잘 작동하지만, 코어뿐만 적어도까지, 멀티 스레드 ENV 코어 데이터에서

1

중복 된 항목이 같은 것은 없다에서 실행되는 여러 상황과 복잡 얻을 수 있습니다 데이터가 관련되어 있습니다. 데이터베이스 관점에서 볼 때의 의미는 아닙니다. 핵심 데이터가 객체 그래프 관리 시스템 인 데이터베이스가 아니기 때문에 어떤 의미가 있습니다.

중복을 방지하려면 먼저 검색을 수행해야합니다. 검색 결과가 NULL이면 저장하고, 그렇지 않으면 아무것도 수행하지 않습니다.

This article

는 당신에게 더, 당신은 결과를 가져오고 그 결과 당신이 중복되지 않도록하려면 개체가 포함되어 있는지 여부를 확인해야 가능한 방법 내장이 없기 때문에 사용자의 요구

+0

yor 제안에 감사드립니다. –

+0

@ShailendraKrGangWar 도와 드리겠습니다! 제발 대답을 upvote 또는 승인 대답은 당신을 도왔습니다 incase 표시하십시오 ... –

+0

@Srikar, 그 링크가 다운되었습니다. 이 기사도 사용할 수 있습니다. 그것을위한 다른 출처가 있습니까? 감사! –

1

최상의 접근 방식은 countForFetchRequest 메서드를 호출하여 일치하는 개체가 있는지 저장소에 대한 평가를 위해 조건자를 사용하는 것입니다. 이 유형의 요청은 어떤 객체를 끌어 오지 않기 때문에 다른 솔루션보다 성능이 좋아야합니다. 다음은 NSManagedObject 하위 클래스에 추가 된 Swift 2.0 구현입니다.

func tokenExists (aToken:String) -> Bool { 
     let request: NSFetchRequest = NSFetchRequest(entityName: self.className!) 

     let predicate = NSPredicate(format: "token == %@", argumentArray: [aToken]) 

     request.predicate = predicate 

     let error: NSErrorPointer = nil 

     let count = self.managedObjectContext!.countForFetchRequest(request, error: error) 

     if count == NSNotFound { 
      return false 
     } 
     return true 
    } 

NB - (하나는 당신이 술어 원하는 평등의 기준을 대체 할 수 있지만이 숫자 식별자를 사용한다 가능한 한 최상의 성능을 사용할 수 ~이면 있다는 사실을 양지 수)는

사용법 :

한 힘 다음 삽입시 위의 함수를 사용

func insertToken (value:String) { 

     if !tokenExists(value) { 
      self.token = value 
      saveState() 
     } 

    } 
0

Apple Sample 코드 자체에서 최상의 접근 방식을 사용하겠습니다. 자세한 내용은 샘플 코드 "ThreadedCoreData"를 참조하십시오.항목이 존재하거나하지 않을 경우

// before adding the earthquake, first check if there's a duplicate in the backing store 
    NSError *error = nil; 
    Earthquake *earthquake = nil; 
    for (earthquake in earthquakes) { 
     fetchRequest.predicate = [NSPredicate predicateWithFormat:@"location = %@ AND date = %@", earthquake.location, earthquake.date]; 

     NSArray *fetchedItems = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error]; 
     if (fetchedItems.count == 0) { 
      // we found no duplicate earthquakes, so insert this new one 
      [self.managedObjectContext insertObject:earthquake]; 
     } 
    } 
+0

멀티 스레드 환경에서는 작동하지 않습니다. –

관련 문제