2011-01-18 17 views

Respuesta

94

-[NSManagedObject objectID] es la ID única para una instancia de objeto en Core Data. Se puede serializar a través de -[NSManagedObjectID URIRepresentation]. Puede recuperar el objectID de un coordinador de tienda persistente con -[NSPersistentStoreCoordinator managedObjectIDForURIRepresentation:] y luego obtener el objeto desde un contexto de objeto gestionado con -[NSManagedObjectContext objectWithID:].

PERO

Usted debe tener en cuenta que la base de datos es no un ORM. Es un object graph management framework. Es decir, usa SQLite (y las identificaciones de fila únicas) como backend es puramente un detalle de implementación. Cuanto antes pueda salirse de la mentalidad SQL/RDBMS, más rápido se sentirá satisfecho con Core Data. En lugar de tratar de encontrar un objeto a partir de un ID almacenado, considere por qué necesita ese objeto y qué objeto lo necesita. Si una instancia de la clase Foo necesita poder acceder a una instancia de la clase Bar, ¿por qué no crear una asociación desde Foo al Bar y establecer la instancia correspondiente Bar como destino de la asociación en la instancia correspondiente Foo? Deje que Core Data haga un seguimiento de los ID de objeto.

+33

Ojalá pudiera darle otra ventaja para 'Core Data is not a database'. – Abizern

+5

Existen casos de uso comunes en los que debe tomar un objeto por su id. Me viene a la mente pasar datos de una selección de celda de vista de tabla a un controlador de vista de detalle. Simplemente podría pasar el objeto en sí, pero a menudo no desea hacerlo si está utilizando un contexto diferente en el detalle VC. – memmons

+1

@Michael: Exactamente. ¿Cuál es la mejor práctica para hacer esto? – Noah

42

Como dijo Barry Wark, recuerde siempre que Core Data no es un orm. Los detalles de Pure SQL no están expuestos al usuario y cada fila es solo un objeto. Por cierto, en algún momento deberás acceder a la "clave principal", por ejemplo, cuando necesites sincronizar la base de datos coredata con bases de datos sql externas (en mi caso, la necesité en una función de devolución de llamada para cambiar el estado de un objeto luego de INSERTAR con éxito en el db remoto). En este caso, puede utilizar:

objectId=[[[myCoredataObject objectID] URIRepresentation] absoluteString] 

que devolverá una cadena como: x-coredata: // 76BA122F-0BF5-4D9D-AE3F-BD321271B004/Objeto/p521, que es el identificador único utilizado por coredata a identifica ese objeto.

Si usted quiere volver un objeto con ese id único:

NSManagedObject *managedObject= [managedObjectContext objectWithID:[persistentStoreCoordinator managedObjectIDForURIRepresentation:[NSURL URLWithString:objectId]]]; 

NB: Recuerde que si el receptor aún no se ha guardado en el contexto CoreData, el ID de objeto es un valor temporal que se cambiar cuando se guarda el objeto

+1

exactamente! el mismo problema. necesario para enviar al servidor esta identificación con los detalles de la entidad para hacer una entrada en mySQL remoto y luego en respuesta, obtener el ID único generado por el servidor con el mismo ID de objeto. obtener el objeto de objectId y almacenar el ID de servidor en él. –

+0

Gracias por la explicación y el código de NYC ... resuelto mi problema ... :) –

+0

@donnit, amogh Entonces, ¿qué hago en una situación en la que estoy guardando contenido fuera del sitio, y luego cuando necesito completar el servidor para luego ser capaz de hacer coincidir Id's y actualizar valores? y también podrá agregar un nuevo objeto si el id no existe en la base de datos. ¿Cómo podría lograr eso entonces? – Pavan

Cuestiones relacionadas