How to add unique constraints for some fields in Core Data

IosCore Data

Ios Problem Overview


I use Xcode for iOS development. I have some entity (for example, User), and I need to set unique constraint for his name, but I can't find how I can do it through visual editor. Is it possible to do it through GUI? Or it's possible through code only? I will be glad to get some screenshot.

Ios Solutions


Solution 1 - Ios

There's a new section in the sidebar when selecting an entity in the editor for Core Data. You can set what constraint(s) you want to be unique across all instances of an entity

For automatic conflict resolution during saves, you'll need to make sure you've got a merge policy set for your managed object context or else you'll just get errors when saving (which might actually be what you want)

[managedObjectContext setMergePolicy:NSMergeByPropertyObjectTrumpMergePolicy];

The "Swift version" is exactly the same

managedObjectContext.mergePolicy = .mergeByPropertyObjectTrumpMergePolicyType

Keep in mind conflict resolution only happens during saves, and not inserts. So if you're making use of a NSFetchedResultsController you will see entities with non-unique constraints as they're inserted.

enter image description here

If you want to sure you have no entities with non-unique constraints in your managed object context without saving (if you're making use of a FRC), this answer is still probably the best way to go. Although, keep in mind, it's expensive if you're doing a lot of inserts, since NSFetchRequests are expensive operations.

Sample code for this demo can be found here

Solution 2 - Ios

Swift solution:

As noted in the other answer, you can have unique constraints in Core Data for iOS9 onwards.

To do this, first add constraints to the Entity from the Core Data Editor (explaination in Zachary's answer).

Then add this line in code:

managedObjectContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy

Note: The uniqueness is checked when you do managedObjectContext.save() not while you're just adding objects to the managed object.

NSMergeByPropertyObjectTrumpMergePolicy is just one of the merge policies, which overwrites the old value with the new one. You might want to check the documentation for other options.

Solution 3 - Ios

swift Version Is Easy Disclaimer : If You Have Conflicting information please delete piror to implementation. Else App will not run. Solution Delete from device and start again

steps are:

  1. Open Core Data File (projectname.xcdatamodeld)
  2. Click on the entity name (needs to be highlighted)
  3. Right Side of screen (in class section) find constraints (hit the plus button)
  4. Right click to edit info rename to Attribute.

// now to add the code in you core data container

  1. open AppDelegate.swift file and scroll into the coredata stack (" // MARK: - Core Data Saving support ")
  2. update the code for the static func saveContext() { let variable = persistentContainer.viewContext "

//now make this simple call that manages update process

variable".mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy"

// clear understanding

static func saveContext () {

    let context = persistentContainer.viewContext

    context.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
    // you need that line
    
    if context.hasChanges {
        do {
          try context.save()
        } catch {

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionmalcoauriView Question on Stackoverflow
Solution 1 - IosZachary OrrView Answer on Stackoverflow
Solution 2 - IosNitin NainView Answer on Stackoverflow
Solution 3 - IosJery StarrView Answer on Stackoverflow