我正在使用Core Data,并希望将auto_increment ID设置为唯一的字段之一。是否可以使用核心数据在iOS中设置auto_increment?任何人都可以帮我一个如何实现这个的小例子吗?
下面是我在数据库中插入记录的代码。在第一个字段" 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"];
答案 0 :(得分:27)
核心数据没有自动增量功能。它在内部使用SQLite的事实大多是无关紧要的 - 如果你专注于类似SQL的细节,你会得到核心数据严重错误。
如果你想要一个递增字段,你必须自己管理它。您可以在应用的NSUserDefaults
中保存当前值。或者您可以将其放入Core Data使用的持久性存储文件的元数据中(请参阅NSPersistentStoreCoordinator
上的方法)。要么是好的,只要确保查找,增加它,并在创建新对象时重新保存它。
但你可能不需要这个领域。核心数据已经为每个托管对象处理唯一ID - 请参阅NSManagedObjectID
。
答案 1 :(得分:0)
我有一个类似的要求,因为我想为用户提供一个递增的(唯一的)编号。我的解决方案是挂接到willSave并确定现有的最高编号。我认为这比摆弄用户默认设置要好得多:
extension Booking {
public override func willSave() {
if bookingNumber == 0 {
let maxNumber: Int32 = self.value(forKeyPath: "bookings.@max.bookingNumber") as? Int32 ?? 0
bookingNumber = maxNumber + 1
}
}
}
答案 2 :(得分:-1)
保存条目后,您可以执行此操作 因此,确保在获得其他之前调用saveContext(),否则总会得到零
目标-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;
}
夫特:
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
}