2010-07-15 10 views
5

Ho questo codice:Come ottenere l'ID di un oggetto salvato nel contesto dell'oggetto gestito di Core Data?

NSEntityDescription *userEntity = [[[engine managedObjectModel] entitiesByName] objectForKey:@"User"]; 
User *user = [[User alloc] initWithEntity:userEntity insertIntoManagedObjectContext:[engine managedObjectContext]]; 

e voglio conoscere l'id dell'oggetto inserito al contesto oggetto gestito. Come posso averlo?

Questo ID rimane lo stesso per la durata di tale oggetto o verrà mantenuto nel database sqlLite sottostante ed essere qualcosa che può essere utilizzato per identificarlo in modo univoco durante un'operazione di recupero (il mio obiettivo finale).

Qualsiasi aiuto apprezzato // :)

risposta

10

Se si desidera salvare l'ID di un oggetto in modo permanente è necessario:

  1. salvare l'oggetto nel contesto in modo che i cambiamenti ID da una temporanea ad un ID permanente.
  2. Estrarre la versione URI dell'ID permanente con -[NSManagedObjectID URIRepresentation]. Ciò restituisce un NSURL che puoi memorizzare come attributo trasformabile in un altro oggetto gestito.
  3. È possibile ottenere l'oggetto utilizzando -[NSPersistentStoreCoordinator managedObjectIDForURIRepresentation:] per generare un nuovo oggetto NSManagedObjectID e quindi utilizzare -[NSManagedObjectContext objectWithID:] per ottenere l'oggetto gestito effettivamente referenziato.

L'URI deve identificare un particolare oggetto in un particolare negozio su un particolare computer ma può cambiare se si apportano modifiche strutturali allo store come la migrazione a una nuova versione del modello.

Tuttavia, probabilmente non è necessario eseguire questa operazione. ObjectIDs svolgono un ruolo molto più piccolo nei dati di base rispetto a quelli di altri sistemi di modelli di dati. Core Data gestisce un oggetto grafico che identifica in modo univoco gli oggetti in base alla loro posizione nel grafico. Semplicemente camminando sulle relazioni del grafico ti porta a un oggetto unico specifico.

L'unica volta che hai veramente bisogno di ObjectID è quando accedi a un oggetto attraverso due o più negozi persistenti. Ne hai bisogno, perché le relazioni non attraversano i negozi.

+0

Grazie, bella risposta! :) – Spanky

2

Leggi su "oggetto gestito ID" nel Core Data Programming Guide

È possibile ottenere l'id oggetto dall'oggetto con qualcosa di simile:

NSManagedObjectID *moID = [managedObject objectID]; 
+1

fyi, l'ID oggetto è temporaneo finché l'archivio persistente non ne fornisce uno permanente. – ninjaneer

0

In primo luogo, stai costruendo i tuoi oggetti in un modo non preferito. In generale è necessario:

User *user = [NSEntityDescription insertEntityForName:@"User" intoManagedObjectContext:[engine managedObjectContext]]; 

In secondo luogo, quando si crea l'oggetto otterrà un ID temporaneo cui è possibile accedere tramite [utente objectID] come David menzionato. Una volta salvato il contesto, verrà visualizzato un nuovo ID "permanente".

Tuttavia, questo ID può e cambia durante la durata dell'entità (sebbene non l'istanza). Cose come la migrazione dei dati possono far cambiare questo ID. Tuttavia, tra il salvataggio del contesto e l'uscita dall'applicazione, l'ID rimarrà lo stesso.

Problemi correlati