2013-03-06 56 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

當你保存,檢查條目存在與否。如果現有隻是更新。如果沒有創建新條目,然後將其保存到DB – Meera 2013-03-06 05:40:48

回答

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

謝謝。 :)這是在這個快速的解決方法和使用謂詞之間。 – 2015-02-17 04:34:44

+0

如果你想要每次新鮮的數據只是從實體中刪除內容並插入新鮮數據。 – 2016-08-16 09:14:28

2

不,coredata沒有內置的uniquing,因爲它不是數據庫。


,你必須保證你的程序邏輯的獨特性。

例如通常情況下,一個提取應該是唯一的條目,如果該提取有1個條目,則不要添加另一個條目,否則添加它!

==>這非常適用於串行CD訪問,但至少就變得非常複雜與多線程ENV

1

在覈心數據有是重複的條目沒有這樣的東西運行多個環境,爲核心數據方面。不是從數據庫的角度來看待它。這是有道理的,因爲核心數據不是一個數據庫,它是一個對象圖管理系統。

因此,爲了防止重複,您需要先執行搜索,然後如果搜索僅返回NULL,則保存,否則不執行任何操作。

This article給你的代碼,你可以根據需要自定義

+0

謝謝大家的建議。 – 2013-03-25 10:35:49

+0

@ShailendraKrGangwar樂意幫忙!請upvote或標記爲接受答案任何答案幫助你... – 2013-03-25 10:42:40

+0

@Srikar,該鏈接關閉。我也可以使用這篇文章。你有另一個來源嗎?謝謝! – 2014-08-04 11:55:56

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

讓我把蘋果示例代碼本身的最佳方法。請參閱示例代碼「ThreadedCoreData」以獲取更多信息。

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

// 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

這不適用於多線程環境 – 2017-11-07 14:06:47

相關問題