sk123
sk123

Reputation: 600

Check to see if an item has already been saved to CoreData

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

Answers (1)

user9106403
user9106403

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

Related Questions