Установка автоматического увеличения в Core iOS

Я использую Core Data и хочу установить идентификатор auto_increment как одно из полей, которое будет уникальным. Можно ли установить auto_increment в iOS с использованием данных ядра? Может ли кто-нибудь помочь мне с небольшим примером того, как это реализовать?

Ниже приведен код, через который я вставляю записи в базу данных. В первом поле "id" я хочу установить его как auto_increment, а не вручную вставить его.

- (NSManagedObjectContext *)managedObjectContext {
    NSManagedObjectContext *context = nil;
    id delegate = [[UIApplication sharedApplication] delegate];
    if ([delegate performSelector:@selector(managedObjectContext)]) {
        context = [delegate managedObjectContext];
    }
    return context;
}

NSManagedObjectContext *context = [self managedObjectContext];

// Create a new managed object
NSManagedObject *newObj = [NSEntityDescription insertNewObjectForEntityForName:@"Users" inManagedObjectContext:context];

[newObj setValue:[NSNumber numberWithInt:userId] forKey:@"id"];
[newObj setValue:theFileName forKey:@"Name"];

Ответы

Ответ 1

Основные данные не имеют функции автоматического увеличения. Тот факт, что он использует SQLite внутренне, в основном не имеет значения - если вы сосредоточитесь на SQL-подобных деталях, вы получите Core Data неправильно.

Если вы хотите увеличивать поле, вам придется управлять им самостоятельно. Вы можете сохранить текущее значение в своем приложении NSUserDefaults. Или вы можете поместить его в метаданные для постоянного файла хранилища, который использует Core Data (см. Методы в NSPersistentStoreCoordinator). Либо все в порядке, просто убедитесь, что просмотрите его, увеличьте его и снова сохраните, когда вы создаете новый объект.

Но вам, вероятно, не нужно это поле. Core Data уже обрабатывает уникальные идентификаторы для каждого управляемого объекта - см. NSManagedObjectID.

Ответ 2

Вот что вы можете сделать, но после сохранения записи Поэтому убедитесь, что вызываете saveContext(), прежде чем вы получите это еще раз, когда вы всегда получите нуль

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
}