2009-02-05 49 views
13

我发现这个美妙的NSManagedObjectID。这对于引用Entity/NSManagedObject/NSEntityDescription非常有用,对吧?
让我们从实体获得一个ID:NSManagedObjectID到NSData

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

所以...任何想法如何得到这个objID为一个字符串?或者更好:NSData。实际上有些东西能够将它保存到NSUserDefaults中。 ;-)

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

回答

37

得到一个存档URI对应于NSManagedObjectobjectID

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]; 
3

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

5

从NSManagedObjectID documentation

对象ID可以转化成其可 封存的 URI表示和后来重新指 回给定对象(使用 managedObjectIDForURIRepresentation: (NSPersistentStoreCoordinator)和 objectWithID: (NSManagedObjectContext)。例如, 应用程序中的最后一个选定组可以存储在 个用户默认通过组 对象的ID。您还可以使用对象 ID URI表示来存储跨越永久性存储的 (其中没有可能的硬连接)的“弱” 关系。

只要把它变成一个URL然后把它变成一个字符串或数据。

3

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

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

0

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

  1. 让你的实体一个新的属性叫做“身份证”
  2. 让你的实体来说父实体的新属性称为“myEntitysMaxId”
  3. 重写你的实体来说母公司实现“addNewMyEntityObject:”
  4. 还有,增加“myEntitysMaxId”,并设置该值作为新的实体来说“ID”
  5. 你什么时候FETC平时一样h基于其属性的实体!

更干净更好!

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