5

我有这个代码:

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

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

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

任何帮助表示赞赏// :)

4

3 回答 3

10

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

  1. 将对象保存到上下文中,以便 ID 从临时 ID 更改为永久 ID。
  2. 使用 提取永久 ID 的 URI 版本-[NSManagedObjectID URIRepresentation]。这将返回一个 NSURL,您可以将其作为可转换属性存储在另一个托管对象中。
  3. 您可以通过使用-[NSPersistentStoreCoordinator managedObjectIDForURIRepresentation:]生成新NSManagedObjectID对象来获取对象,然后使用-[NSManagedObjectContext objectWithID:]获取实际引用的托管对象。

URI 应该标识特定计算机上特定商店中的特定对象,但如果您对商店进行任何结构更改(例如将其迁移到新模型版本),它可能会发生变化。

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

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

于 2010-07-15T13:20:33.080 回答
2

阅读核心数据编程指南中的“托管对象 ID”

您可以通过以下方式从对象中获取对象 ID:

NSManagedObjectID *moID = [managedObject objectID];
于 2010-07-15T00:51:14.867 回答
0

首先,您正在以非首选方式构建对象。一般来说,你应该:

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

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

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

于 2010-07-15T03:43:11.333 回答