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

Anu*_*hye 20 core-data auto-increment nsmanagedobject ios xcode5

我正在使用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"];
Run Code Online (Sandbox Code Playgroud)

Tom*_*ton 28

核心数据没有自动增量功能.它在内部使用SQLite的事实大多是无关紧要的 - 如果你专注于类似SQL的细节,你会得到核心数据严重错误.

如果你想要一个递增字段,你必须自己管理它.您可以在应用中保存当前值NSUserDefaults.或者您可以将其放在Core Data使用的持久性存储文件的元数据中(请参阅方法NSPersistentStoreCoordinator).要么是好的,只要确保查找,增加它,并在创建新对象时重新保存它.

但是你可能不需要这个领域.核心数据已经为每个托管对象处理唯一ID - 请参阅NSManagedObjectID.

  • 实际上,我可以在这里考虑一个用例.如果您尝试在应用程序启动之间跟踪某个Core Data对象,则"NSManagedObjectID"不可靠,因为它可以更改(例如,在数据迁移之后).因此,您需要为此创建自己的唯一标识符,在这种情况下,自动递增ID或类似标识是合理的选择. (10认同)
  • 一个更简单的用户案例:当顺序很重要时,您需要按创建顺序保留对象。 (3认同)
  • 这就是为什么我说“可能”。自动增量可能仍然是一个坏主意,因为任何同步其数据(现在或将来)的应用程序都存在重复的风险。如果需要唯一 ID,UUID 可能更安全。 (2认同)
  • 如果这就是为什么您说“可能”的原因,那么您应该继续提及它。对于可能依赖NSManagedObjectID的任何人,认为这是应用程序启动之间的持久性ID而言,这是一个有用的实现细节。我同意您关于AutoIncrement的意见-出于同样的原因,我们最终也使用了UUID。 (2认同)
  • 我只是在回答一个问题,没有详细讨论核心数据中唯一ID的所有可能用法以及NSManagedObjectID的全部含义。我的答案说明了如何实现问题中所述的目标。 (2认同)