Установка автоматического увеличения в 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
}