【问题标题】:NSManagedObjectID into NSDataNSManagedObjectID 到 NSData
【发布时间】:2010-10-05 17:04:27
【问题描述】:

我发现了这个很棒的 NSManagedObjectID。这对于引用 Entity/NSManagedObject/NSEntityDescription 非常有用,对吧?
让我们从一个实体获取一个 ID:

NSEntityDescription *entity = [self newEntity];     
NSManagedObjectID *objID = [entity objectID];

那么...知道如何将这个objID 变成一个字符串吗?或者更好:NSData。实际上可以将其保存到 NSUserDefaults 中。 ;-)

顺便说一句:NSFetchRequest 不想在我的情况下工作。我使用此示例的修改版本:answer of an old question

【问题讨论】:

    标签: cocoa core-data save


    【解决方案1】:

    这是我目前发现的最简洁和最短的方法,使用 4.0 中添加的 setURLgetURL 方法以避免对 NSKeyedUnarchiverNSKeyedArchiver 的额外调用:

    二传手:

     + (void)storeSomeObjectId:(NSManagedObjectID *)objectId
     {
         [[NSUserDefaults standardUserDefaults] setURL:[objectId URIRepresentation] 
                                                forKey:@"someObjectIdKey"];
         [[NSUserDefaults standardUserDefaults] synchronize];
     }
    

    吸气剂:

     + (SomeManagedObject *)getObjectByStoredId
     {
         NSURL *uri = [[NSUserDefaults standardUserDefaults] URLForKey:@"someObjectIdKey"];
         NSManagedObjectID *objectId = [self.persistentStoreCoordinator managedObjectIDForURIRepresentation:uri];
         SomeManagedObject *object = [self.managedObjectContext objectWithID:objectId];
     }
    

    【讨论】:

      【解决方案2】:

      正如@preston 所说,不要将 objectID 保存到磁盘,而是:

      1. 在您的实体上创建一个名为“id”的新属性
      2. 在您的实体父实体上创建一个名为“myEntitysMaxId”的新属性
      3. 覆盖您的实体父实现“addNewMyEntityObject:”
      4. 在那里,增加“myEntitysMaxId”并将该值设置为新实体“id”
      5. 当您根据其属性获取实体时,请照常执行!

      更清洁更好!

      【讨论】:

        【解决方案3】:

        在归档之前,您不需要将 NSURL 转换为 NSString。只需归档 NSURL。

        编辑:我最近了解到对象的 ID 可以更改,例如在迁移之后。因此,将 ID 保存到磁盘以期望以后能够引用该对象似乎不是一个好主意。

        【讨论】:

          【解决方案4】:

          要获取与NSManagedObjectobjectID 对应的归档URI:

          NSManagedObject* myMO;
          ...
          NSURL *uri = [[myMO objectID] URIRepresentation];
          NSData *uriData = [NSKeyedArchiver archivedDataWithRootObject:uri];
          

          为了返回原始托管对象的实例,您需要一个 CoreData 堆栈,其中包含该实例的持久存储已添加NSPersistentStoreCoordinator。那么:

          NSData *uriData;
          NSPersistentStoreCoordinator *psc;
          NSManagedObjectContext *moc; //with moc.persistentStoreCoordinator = psc.
          ...
          NSURL *uri = [NSKeyedUnarchiver unarchiveObjectWithData:uriData];
          NSManagedObjectID *moID = [psc managedObjectIDForURIRepresentation:uri];
          NSManagedObject *myMO = [moc objectWithID:moID];
          

          【讨论】:

            【解决方案5】:

            来自 NSManagedObjectID documentation

            对象 ID 可以转换为 URI 表示可以是 存档并稍后重新创建以供参考 返回给定对象(使用 managedObjectIDForURIRepresentation: (NSPersistentStoreCoordinator)和 对象ID: (NSManagedObjectContext)。例如, 中最后选择的组 应用程序可以存储在 用户默认通过组 对象的标识。你也可以使用对象 用于存储“弱”的 ID URI 表示 跨持久存储的关系 (无法进行硬连接)。

            只需将其转换为 URL,然后将其转换为字符串或数据。

            【讨论】:

              【解决方案6】:

              你看过URIRepresentation吗?将 NSURL 转换为 NSString 和 NSData 很容易。

              【讨论】:

                猜你喜欢
                • 2011-03-02
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多