【问题标题】:How to get the ID of an object saved to Core Data's managed object context?如何获取保存到 Core Data 托管对象上下文的对象 ID?
【发布时间】:2011-03-16 03:59:00
【问题描述】:

我有这个代码:

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

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

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

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

【问题讨论】:

    标签: objective-c core-data nsmanagedobjectcontext


    【解决方案1】:

    阅读Core Data Programming Guide中的“托管对象ID”

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

    NSManagedObjectID *moID = [managedObject objectID];
    

    【讨论】:

    • fyi,objectID 是临时的,直到持久存储为其提供永久的。
    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-09-02
        • 1970-01-01
        • 1970-01-01
        • 2012-10-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多