2010-07-15 43 views
5

我有这样的代码:如何获取保存到Core Data托管对象上下文的对象的ID?

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

,我想知道插入管理对象上下文中的对象的ID。我怎么能得到这个?

请问该ID在该对象的生存期内保持不变,还是会保留在此之下的sqlLite数据库中,并且可以用于在获取操作(我的最终目标)期间唯一标识它。

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

回答

10

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

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

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

但是,您可能不需要执行任何操作。 ObjectIDs在核心数据中扮演的角色要比在其他数据模型系统中扮演的角色要小得多。核心数据维护一个对象图,该对象图通过它们在图中的位置唯一标识对象。简单地走图关系就可以把你带到一个特定的唯一对象。

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

+0

谢谢,真棒回答! :) – Spanky 2010-07-16 09:41:04

2

Core Data Programming Guide

阅读上 “管理对象ID” 你可以从对象的对象ID的东西,如:

NSManagedObjectID *moID = [managedObject objectID]; 
+1

fyi,objectID是临时的,直到持久性存储为永久存储。 – ninjaneer 2013-11-05 10:29:20

0

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

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

其次,当你创建对象时,它会得到您可以通过[用户的objectID]大卫提到访问临时ID。一旦你保存了上下文,那么它会得到一个新的“永久”的ID。

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

相关问题