Reputation: 600
I'm saving items to favourites and retrieving them in a tableView. However right now a user can add duplicates of these items. I'm trying to avoid this by checking to see if the item already exists in CoreData therefore prevent the item from being saved again. How can i be able to achieve this
var item: ItemModel?
func saveItemsToCoreDataStack(completion: @escaping ()-> Void) {
managedObjectContext!.perform {
do {
try self.managedObjectContext?.save()
completion()
print("Item saved to Database")
} catch {
print("Sorry Coudn't save itemto Database \(error.localizedDescription)")
}
}
}
var items = [Item]()
var managedObjectContext: NSManagedObjectContext? {
return (UIApplication.shared.delegate as! AppDelegate ).persistentContainer.viewContext
}
var fetchResultController: NSFetchedResultsController<Item>!
func retrieveitemsFromDatabase() {
fetchItemFromCoreData { (items) in
if let item = items {
self.items = item
self.tableView.reloadData()
}
}
}
func fetchItemFromCoreData(completion: ([Item]?)-> Void) {
var results = [Item]()
let request: NSFetchRequest<Item> = Item.fetchRequest()
do {
results = try managedObjectContext!.fetch(request)
completion(results)
} catch {
print("Sorry couldn't fetch item from Database \(error.localizedDescription)")
}
}
Upvotes: 0
Views: 676
Reputation:
Here is a solution through which you can prevent duplicate records into your core data.
Swift 4.0
let entityForTableName = NSEntityDescription.entity(forEntityName: "EntityName", in: managedObjectContext)
let fetchRequest = NSFetchRequest<NSFetchRequestResult>()
// Predicate with value which are you wan't to be repeated i.e server_id, item_id etc.
let predicate = NSPredicate.init(format: "yourUniqueKey == %@", <YourUniqueValue>)
fetchRequest.predicate = predicate
fetchRequest.entity = entityForTableName
do {
let arrData = try managedObjectContext.fetch(fetchRequest)
if arrData.count > 0 {
print("Record already exist")
} else {
// Write your code here to add record
}
} catch {
print(error.localizedDescription)
}
Objecive C
// Solution for objective c also
NSEntityDescription *yourEntityObject = [NSEntityDescription entityForName:@"YourEntityName" inManagedObjectContext:_managedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"uniqueField == %d", <ValueToCheckAlreadyExist>];
[fetchRequest setEntity:yourEntityObject];
NSArray *arrData = [_managedObjectContext executeFetchRequest:fetchRequest error:nil];
if ([arrData count] > 0) {
// Data already exist
} else {
// Create new data
}
Upvotes: 1