2012-04-19 8 views
5

Estoy tratando de archivar/desarchivar NSManagedObjectIDs en objetos de Core Data para que la próxima vez que inicie mi aplicación pueda recuperar estos ID y usarlos para buscar objetos específicos.¿Cuál es la forma correcta de almacenar un NSURL en Core Data?

me trataron "archivar" el ID de la siguiente manera:

//defaultConfiguration is an NSManagedObject defined elsewhere and it works just fine...  
// and newObject is also properly initialized, bound to a context,etc... 

ArchivedID* newID = [NSEntityDescription insertNewObjectForEntityForName:@"ArchivedID" inManagedObjectContext:managedObjectContext]; 
[self.defaultConfiguration addArchiveIDObject:newID]; 
newID.idURI = [[newObject objectID] URIRepresentation]; 
[managedObjectContext save:&error]; 

Y luego desarchivándolos como esta (que sólo voy a [anyObject] Porque yo estoy probando y no hay una sola en este punto):

NSManagedObjectID* ID = [managedObjectContext.persistentStoreCoordinator managedObjectIDForURIRepresentation:[defaultConfiguration.archiveID anyObject]]; 

Pero cuando trato de conseguir la URL espalda como antes, me sale el siguiente excepción:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[ArchivedID relativeString]: unrecognized selector sent to instance 0x7f59f20' 

El atributo en la entidad se configuró a través de Xcode como "transformable" y dejé el campo de valor del transformador en Xcode vacío ya que la documentación de Core Data parece implicar que si está vacía, use el transformador predeterminado.

¿Qué estoy haciendo mal?

+0

¿Qué tiene esto que ver con nsurl? – Chet

Respuesta

0

Ok ... Ha sido 14hrs recta de codificación .. Soy un idiota .. eh ..:

me olvidó para acceder al atributo del objeto ArchivedID. Es decir:

NSManagedObjectID* ID = [managedObjectContext.persistentStoreCoordinator managedObjectIDForURIRepresentation:[defaultConfiguration.archiveID anyObject]]; 

debería ser

NSManagedObjectID* ID = [managedObjectContext.persistentStoreCoordinator managedObjectIDForURIRepresentation:[[defaultConfiguration.archiveID anyObject] idURI]]; 
+0

Eso también funciona :) – kevboh

1

Es posible que pueda resolver este problema sin almacenar las URL. Considere agregar una bandera booleana a su modelo y marcar los objetos que desea recuperar como verdaderos, luego busque objetos marcados la próxima vez que se inicie su aplicación.

Sin embargo, podría intentar obtener la versión de cadena de la URL con -absoluteString y almacenarla.

+0

Si tomó este enfoque, asegúrese de marcar el cuadro "indexado" en el atributo booleano ya que estaría buscando en función de ese indicador. – ma11hew28

-1

me gusta lo @kevboh sugeridos. También puede considerar almacenar objectID s de NSManagedObject s específicos en NSUserDefaults. P. ej .:

[[NSUserDefaults standardUserDefaults] setObject:featuredNSManagedObjectIDArray 
              forKey:@"FeaturedNSManagedObjectIDs"]; 
+0

El camino de kevboh funciona pero agrega un nivel extra de indirección. Estoy bien como lo estaba haciendo, es solo que tuve un error tipográfico. – SaldaVonSchwartz

0

Hmmm. Parece que hay una manera mucho más simple de hacer esto con CoreData. Recuerde, CoreData es un gráfico de objetos. Es bueno para hacer un seguimiento de las relaciones.

¿Por qué no tener simplemente una entidad en CoreData que mantiene una relación de uno a muchos con los objetos que te gustan? Luego, puede simplemente insertar/eliminar/buscar/iterar/lo que sea sobre la colección de objetos.

+0

El método de URL archivado permite la transferencia de los ID a través de JSON, etc. y si conservo muchos para los objetos, también podría buscarlos (para empezar, están en un montón). El objetivo era poder recuperarlos justo a tiempo sin crear una búsqueda completa, predicado, etc. – SaldaVonSchwartz

Cuestiones relacionadas