在iPhone上为Core Data程序创建唯一ID

时间:2009-08-29 17:58:11

标签: iphone cocoa-touch core-data

我在弄清楚这个核心数据时遇到了一些麻烦。如何创建具有唯一ID的新条目?在SQL中,我只将一个字段声明为自动增量字段。我在这里没有看到类似的东西,但我可能会遗漏一些东西。我只想要一个自动递增的NSInteger字段,所以当我手动将项目添加到数据库时,我会有一些形式的引用。

8 个答案:

答案 0 :(得分:144)

虽然我同意你所说的,核心数据背后有一个ID机制。 ID确实由Core-Data管理,但您可以使用以下命令检索它们:

NSManagedObjectID *moID = [managedObject objectID];

有关更多信息,请参阅: Core Data Programming Guide

答案 1 :(得分:28)

这不是CoreData的工作方式。

在CoreData中,您可以创建实体实例。每个实例都是唯一的。然后根据需要检索和操作实例。 CoreData负责为您提供持久性,包括唯一标识实例。

远离传统关系数据库的所有知识。

CoreData是一项非常强大的技术,它提供的功能远远超出了持久性等数据库。如果你接受它,它将为你节省很多代码并且表现得非常好。

答案 2 :(得分:6)

看看:[[NSProcessInfo processInfo] globallyUniqueString]

Apple docs:该流程的全局ID。该ID包括主机名,进程ID和时间戳,以确保该ID对于网络是唯一的,如果您不希望人们猜测该ID,这将非常方便。

答案 3 :(得分:6)

以下是CoreData对象的三种唯一ID表示形式:

NSManagedObjectID *taskID = [task objectID];
NSURL *taskUniqueURLKey = task.objectID.URIRepresentation;
NSString *taskUniqueStringKey = task.objectID.URIRepresentation.absoluteString;

!!!!注意:如果你想使用上面的唯一键作为索引,请确保在使用它之前将对象保存到上下文,或者objectID将是一个临时的Id,稍后将被替换(例如,保存)。请参阅NSManagedObjectID类的Apple文档:

- (BOOL)isTemporaryID;    // indicates whether or not this ID will be replaced later, 
such as after a save operation (temporary IDs are assigned to newly inserted objects 
and replaced with permanent IDs when an object is written to a persistent store); most
 IDs return NO

答案 4 :(得分:2)

如果我们想要与需要自动增量id的远程数据库同步独特的数据行,该怎么办?如果需要,有没有办法实现自动增量的id。我知道核心数据不是必需的,但是我需要从远程数据库导入数据,然后再次上传并确保id完好无损。

答案 5 :(得分:2)

在Swift中更新@Lukasz答案:

static func nextAvailble(_ idKey: String, forEntityName entityName: String, inContext context: NSManagedObjectContext) -> Int {
    let fetchRequest: NSFetchRequest<NSFetchRequestResult> = NSFetchRequest(entityName: entityName)
    fetchRequest.propertiesToFetch = [idKey]
    fetchRequest.sortDescriptors = [NSSortDescriptor(key: idKey, ascending: true)]

    do {
        let results = try context.fetch(fetchRequest)
        let lastObject = (results as! [NSManagedObject]).last

        guard lastObject != nil else {
            return 1
        }

        return lastObject?.value(forKey: idKey) as! Int + 1

    } catch let error as NSError {
        //handle error
    }

    return 1 
}

答案 6 :(得分:1)

我认为这在这种情况下会很有用。

http://lists.apple.com/archives/cocoa-dev/2006/Jul/msg01801.html 我们可以获得maxExistingID。因此,我们可以在保存新项目时增加该项目

答案 7 :(得分:1)

核心数据用于持久性框架,该框架抽象主键。

每个NSManagedObject都有自己的内置唯一键,可在其objectID属性中使用。

此id在内部用于通过其关系链接实体。无需像以前在SQL中那样将自己的id维护为主键。

您始终可以通过NSManagedObject.objectID获取id。并使用NSMananagedObjectContext.objectWithId

获取对象上下文