如何获取保存到Core Data的托管对象上下文的对象的ID?

时间:2010-07-15 00:44:54

标签: objective-c core-data nsmanagedobjectcontext

我有这段代码:

NSEntityDescription *userEntity = [[[engine managedObjectModel] entitiesByName] objectForKey:@"User"];
User *user = [[User alloc] initWithEntity:userEntity insertIntoManagedObjectContext:[engine managedObjectContext]];

我想知道插入到托管对象上下文的对象的id。我怎么能得到它?

对于该对象的生命周期,该id是否保持不变,或者它是否会持久存储在此下面的sqlLite数据库中,并且可以用于在获取操作期间唯一地标识它(我的最终目标)。

任何帮助赞赏//:)

3 个答案:

答案 0 :(得分:10)

如果您想永久保存对象的ID,您需要:

  1. 将对象保存到上下文中,以便ID从临时ID更改为永久ID。
  2. 使用-[NSManagedObjectID URIRepresentation]提取永久ID的URI版本。这将返回一个NSURL,您可以将其存储为另一个托管对象中的可转换属性。
  3. 您可以使用-[NSPersistentStoreCoordinator managedObjectIDForURIRepresentation:]生成新的NSManagedObjectID对象,然后使用-[NSManagedObjectContext objectWithID:]获取实际引用的托管对象来获取对象。
  4. URI应该标识特定计算机上特定商店中的特定对象,但如果对商店进行任何结构更改(例如将其迁移到新的模型版本),则可以更改该URI。

    但是,您可能不需要执行任何操作。与其他数据模型系统相比,ObjectID在Core Data中扮演的角色要小得多。 Core Data维护一个对象图,该对象图根据图中的位置唯一标识对象。只需遍历图形关系即可转到特定的唯一对象。

    您真正需要ObjectID的唯一时间是在两个或多个持久性存储中访问对象时。你需要它们,因为关系不会跨越商店。

答案 1 :(得分:2)

阅读Core Data Programming Guide

中的“托管对象ID”

您可以使用以下内容从对象获取对象ID:

NSManagedObjectID *moID = [managedObject objectID];

答案 2 :(得分:0)

首先,您以非首选方式构建对象。通常你应该:

User *user = [NSEntityDescription insertEntityForName:@"User" intoManagedObjectContext:[engine managedObjectContext]];

其次,当您创建对象时,它将获得一个临时ID,您可以通过David提到的[user objectID]访问该ID。保存上下文后,它将获得一个新的“永久”ID。

然而,这个id可以并确实在实体的生命周期内发生变化(尽管不是实例)。迁移数据之类的事情可能会导致此ID发生变化。但是,在保存上下文和退出应用程序之间,id将保持不变。