在Core数据iOS中设置自动增量

时间:2014-06-25 10:43:48

标签: ios core-data xcode5 auto-increment nsmanagedobject

我正在使用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"];

3 个答案:

答案 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
}