2009-02-05 30 views
13

Encontré este maravilloso NSManagedObjectID. Esto sería muy útil para hacer referencia a una entidad/NSManagedObject/NSEntityDescription, ¿verdad?
Vamos a obtener una ID de una entidad:NSManagedObjectID en NSData

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

Así que ... alguna idea de cómo conseguir este objID en una cadena? O mejor: NSData. En realidad, algo para poder guardarlo en NSUserDefaults. ;-)

Por cierto: NSFetchRequest no quiere funcionar en mi caso. Utilizo una versión modificada de este ejemplo: answer of an old question.

Respuesta

37

para obtener una URI archivado correspondiente a un NSManagedObject 's objectID:

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

Con el fin de volver a una instancia de objeto gestionado original, es necesario una pila CoreData con el almacén persistente sosteniendo esa instancia ya ha agregado al NSPersistentStoreCoordinator. Luego:

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

¿Has mirado URIRepresentation? Es fácil convertir un NSURL a un NSString, y eso a un NSData.

5

De los NSManagedObjectID documentation:

ID de objeto se puede transformar en una representación URI que se puede archivados y recreado más tarde para referirse de nuevo a un objeto dado (usando managedObjectIDForURIRepresentation: (NSPersistentStoreCoordinator) y objectWithID: (NSManagedObjectContext). Por ejemplo, el último grupo seleccionado en una aplicación podría almacenarse en el valores predeterminados del usuario a través del ID del objeto del grupo. También puede usar las representaciones de ID de URI del objeto para almacenar las relaciones "débiles" en las tiendas persistentes (donde no es posible la unión segura).

Simplemente conviértalo en una URL y luego conviértalo en una cadena o en un dato.

3

No necesita convertir el NSURL en un NSString antes de archivarlo. Solo archiva el NSURL.

Editar: Hace poco descubrí que el ID de un objeto puede cambiar, por ejemplo, después de una migración. Por lo tanto, parece que no es una buena idea guardar una ID en el disco esperando poder hacer referencia al objeto más adelante.

0

Como @preston Dicho esto, no guarde una IDobjeto en el disco, en su lugar:

  1. hacer un nuevo atributo en su entidad llamada "id"
  2. Hacer un nuevo atributo en su entitys entidad matriz llamada "myEntitysMaxId"
  3. anular su aplicación entitys padres "addNewMyEntityObject:"
  4. Allí, aumentar "myEntitysMaxId" y establecer ese valor como los nuevos entitys "id"
  5. hacer como lo hace normalmente cuando FETC h una entidad basada en sus atributos!

Mucho más limpio y mejor!

3

Aquí es la forma más limpia y más corto que he encontrado para hacer esto en la actualidad, el uso de la setURL y métodos getURL añadido en 4.0 para evitar llamadas adicionales a NSKeyedUnarchiver y NSKeyedArchiver:

Setter:

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

Getter:

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