Set auto increment in Core data iOS Set auto increment in Core data iOS ios ios

Set auto increment in Core data iOS


Core Data does not have an auto-increment feature. The fact that it uses SQLite internally is mostly irrelevant-- if you focus on SQL-like details, you'll get Core Data badly wrong.

If you want an incrementing field, you'll have to manage it yourself. You can save the current value in your app's NSUserDefaults. Or you could put it in the metadata for the persistent store file that Core Data uses (see methods on NSPersistentStoreCoordinator). Either is fine, just make sure to look it up, increment it, and re-save it when you create a new object.

But you probably don't need this field. Core Data already handles unique IDs for each managed object-- see NSManagedObjectID.


I had a similar requirement as I wanted to have an incrementing (unique) numbering for the user. My solution is to hook into willSave and determine the highest already existing number. I think this is way better than fiddling with user defaults:

extension Booking {    public override func willSave() {        if bookingNumber == 0 {            let maxNumber: Int32 = self.value(forKeyPath: "bookings.@max.bookingNumber") as? Int32 ?? 0            bookingNumber = maxNumber + 1        }    }}


Here is something you can do but after saving the EntrySo make sure calling saveContext() before you get that else you gonna always get zero

objective-C

- (int)getAutoIncrement:(InAppMessage*)inApp {    int number = 0;    NSURL *url = [[inApp objectID] URIRepresentation];    NSString *urlString = url.absoluteString    NSString *pN = [[urlString componentsSeparatedByString:@"/"] lastObject];    if ([pN containsString:"p"]){        NSString *stringPart = [pN stringByReplacingOccurrencesOfString:@"p" withString:@""]        number = stringPart.intValue    }    url = nil;    urlString = nil;    pN = nil;    stringPart = nil;    return number;}

Swift:

func getAutoIncremenet() -> Int64   {    let url = self.objectID.uriRepresentation()    let urlString = url.absoluteString    if let pN = urlString.components(separatedBy: "/").last {        let numberPart = pN.replacingOccurrences(of: "p", with: "")        if let number = Int64(numberPart) {            return number        }    }    return 0}