有没有办法限制核心数据中的重复条目?

我一直在试图在核心数据中添加对象。 所以,我希望它不应该允许核心数据存储中的重复条目。 怎么做? 这是我的代码相关的保存数据。

-(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"); } } 

由于没有可用的内置方法,因此您需要获取结果并检查结果是否包含不希望重复的对象。

这里是代码片段:

 -(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 } } 

希望这可以帮助你!

不,coredata没有内置的uniquing,因为它不是一个数据库。


你必须保证程序逻辑的唯一性。

例如,经常有人为一个应该是唯一的条目提取,如果该条目有1个条目,则不要添加另一个条目,否则添加它!

==>这对串行CD访问很有效,但是可以在multithreading环境中运行的多个上下文变得复杂

在核心数据中,不存在重复条目,至less就核心数据而言。 不是从数据库的angular度来看待它。 这是有道理的,因为核心数据不是一个数据库,它是一个对象图pipe理系统。

因此,为了防止重复,你需要先search然后search返回NULL然后保存,否则什么都不做。

本文为您提供可以根据需要自定义的代码

我认为最好的方法是使用谓词来调用countForFetchRequest方法来评估你的商店是否有一个匹配的对象。 由于这种types的请求不会退回任何对象,所以它应该比其他解决scheme更高效。 这里是一个添加到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() } } 

让我把苹果示例代码本身的最佳方法。 请参阅示例代码“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]; } }