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