有没有办法限制核心数据中的重复条目?
我一直在试图在核心数据中添加对象。 所以,我希望它不应该允许核心数据存储中的重复条目。 怎么做? 这是我的代码相关的保存数据。
-(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]; } }
- 获取关系并显示在UITableView中
- NSFetchedResultsController不总是调用didChangeObject:atIndexPath:forChangeType:newIndexPath:for NSFetchedResultsChangeMove
- WatchKit核心数据同步了
- multithreading违反核心数据
- 如何使用StackMob作为后端获取sm_owner用户对象
- 核心数据:删除/添加对象时出错
- 出现在核心数据关系中的不需要的对象
- NSPredicate predicateWithFormat传入属性名称
- 试图插入nil对象的NSFetchedResultsController