Есть ли способ ограничить дублирование записей в основных данных?

Я пытаюсь добавить объекты в основные данные. Поэтому я хочу, чтобы он не позволял дублировать записи в хранилище основных данных. Как это сделать? Это мой код, связанный с сохранением данных.

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

Надеюсь, это поможет вам!

no, coredata не имеет встроенного в uniquing, поскольку это не БД.


вы должны обеспечить уникальность в своей программной логике.

например, часто возникает выборка для записи, которая должна быть уникальной, и если эта выборка имеет 1 запись, не добавляйте ее еще, добавьте ее!

==> это хорошо работает для серийного доступа к компакт-диску, но может усложняться с несколькими контекстами, которые запускаются в многопоточном env

В Core Data нет такой вещи, как дубликаты записей, по крайней мере, в отношении основных данных. Не в смысле смотреть на нее с точки зрения базы данных. Это имеет смысл, потому что Core Data не является базой данных, это система управления графами объектов.

Таким образом, чтобы предотвратить дубликаты, вам нужно выполнить поиск сначала, а затем, если поиск возвращает NULL тогда сохраните, иначе ничего не сделайте.

Эта статья дает вам код, который вы можете настроить для своих нужд

Я думаю, что лучшим подходом было бы вызвать метод countForFetchRequest, используя предикат, чтобы оценить, имеет ли ваш магазин соответствующий объект. Поскольку этот тип запроса не отбрасывает какие-либо объекты, он должен быть более эффективным, чем другие решения. Вот реализация Swift 2.0, добавленная в подкласс NSManagedObject.

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

Позвольте мне использовать лучший подход к самому образцу Apple. Пожалуйста, обратитесь к образцу кода «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]; } } 
  • CoreData: «Невозможно удалить объект, который никогда не был вставлен».
  • Core Data - не может хранить два отдельных объекта
  • Как правильно управлять NSManagedObjectContext в каждом контроллере представления?
  • Как получить конкретные данные в отношениях от одного до многих основных данных?
  • CoreData: ошибка: серьезная ошибка приложения. Исключение было обнаружено при обработке данных Core Data
  • вставка ячеек в верхней части таблицы с помощью NSFetchedResultsController
  • Как исправить предикат свойства CoreData Fetched для слабой связи чата и сообщений?
  • iOS8 замерзает в
  • CoreData insertNewObjectForEntityForName и executeFetchRequest return nil
  • Objective C - одно-много связей с данными из основных данных
  • Должен иметь обратный в Core Data
  • Давайте будем гением компьютера.