NSManagedObjectID进入NSData

时间:2009-02-05 15:44:51

标签: cocoa core-data save

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

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

那么......任何想法如何将这个objID变成字符串?或者更好:NSData。实际上可以将它保存到NSUserDefaults。 ;-)

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

6 个答案:

答案 0 :(得分:38)

获取与NSManagedObject的{​​{1}}:

对应的已归档URI
objectID

为了返回原始托管对象的实例,您需要一个CoreData堆栈,其持久存储将已添加已添加到NSManagedObject* myMO; ... NSURL *uri = [[myMO objectID] URIRepresentation]; NSData *uriData = [NSKeyedArchiver archivedDataWithRootObject:uri]; 。然后:

NSPersistentStoreCoordinator

答案 1 :(得分:5)

来自NSManagedObjectID documentation

  

对象ID可以转换为   URI表示可以是   存档并稍后重新创建   回到给定的对象(使用   managedObjectIDForURIRepresentation:   (NSPersistentStoreCoordinator)和   objectWithID:   (的NSManagedObjectContext)。例如,   最后选择的一个组   应用程序可以存储在   用户默认通过该组   对象的ID。您也可以使用对象   用于存储“弱”的ID URI表示   跨持久性商店的关系   (没有硬连接的地方)。

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

答案 2 :(得分:3)

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

答案 3 :(得分:3)

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

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

答案 4 :(得分:3)

这是我目前发现的最干净,最短的方法,使用4.0中添加的setURL和getURL方法来避免额外调用NSKeyedUnarchiver和NSKeyedArchiver:

<强>设置器:

 + (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];
 }

答案 5 :(得分:0)

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

  1. 在您的实体上创建一个名为&#34; id&#34;
  2. 的新属性
  3. 在您的实体父实体上创建一个名为&#34; myEntitysMaxId&#34;
  4. 的新属性
  5. 覆盖您的实体父实现&#34; addNewMyEntityObject:&#34;
  6. 在那里,增加&#34; myEntitysMaxId&#34;并将该值设置为新实体&#34; id&#34;
  7. 按照通常基于其属性获取实体时的操作!
  8. 更清洁,更好!