我有这段代码:
NSEntityDescription *userEntity = [[[engine managedObjectModel] entitiesByName] objectForKey:@"User"];
User *user = [[User alloc] initWithEntity:userEntity insertIntoManagedObjectContext:[engine managedObjectContext]];
我想知道插入到托管对象上下文的对象的id。我怎么能得到它?
对于该对象的生命周期,该id是否保持不变,或者它是否会持久存储在此下面的sqlLite数据库中,并且可以用于在获取操作期间唯一地标识它(我的最终目标)。
任何帮助赞赏//:)
答案 0 :(得分:10)
如果您想永久保存对象的ID,您需要:
-[NSManagedObjectID URIRepresentation]
提取永久ID的URI版本。这将返回一个NSURL,您可以将其存储为另一个托管对象中的可转换属性。-[NSPersistentStoreCoordinator managedObjectIDForURIRepresentation:]
生成新的NSManagedObjectID
对象,然后使用-[NSManagedObjectContext objectWithID:]
获取实际引用的托管对象来获取对象。 URI应该标识特定计算机上特定商店中的特定对象,但如果对商店进行任何结构更改(例如将其迁移到新的模型版本),则可以更改该URI。
但是,您可能不需要执行任何操作。与其他数据模型系统相比,ObjectID在Core Data中扮演的角色要小得多。 Core Data维护一个对象图,该对象图根据图中的位置唯一标识对象。只需遍历图形关系即可转到特定的唯一对象。
您真正需要ObjectID的唯一时间是在两个或多个持久性存储中访问对象时。你需要它们,因为关系不会跨越商店。
答案 1 :(得分:2)
您可以使用以下内容从对象获取对象ID:
NSManagedObjectID *moID = [managedObject objectID];
答案 2 :(得分:0)
首先,您以非首选方式构建对象。通常你应该:
User *user = [NSEntityDescription insertEntityForName:@"User" intoManagedObjectContext:[engine managedObjectContext]];
其次,当您创建对象时,它将获得一个临时ID,您可以通过David提到的[user objectID]访问该ID。保存上下文后,它将获得一个新的“永久”ID。
然而,这个id可以并确实在实体的生命周期内发生变化(尽管不是实例)。迁移数据之类的事情可能会导致此ID发生变化。但是,在保存上下文和退出应用程序之间,id将保持不变。