2012-07-19 5 views
10

Ho bisogno di ottenere un identificativo univoco per un tipo di NSManagedObject che ho creato. Deve essere disponibile non appena l'oggetto è stato creato, non cambia mai ed è completamente unico.Identificatore univoco per NSManagedObject

Questo esclude lo NSManagedObjectID, poiché questo può cambiare quando il contesto viene salvato. Credo che il metodo -hash potrebbe non essere univoco se i miei oggetti hanno le stesse proprietà.

Mi piacerebbe davvero evitare di creare un campo UUID unidificatore univoco altrimenti inutile sull'entità in quanto ciò sembra dispendioso e disordinato. Esiste una best practice accettata qui?

+0

Hai considerato un hash salato? – Jim

+2

"NSManagedObjectID" cambierà dopo il ** primo ** salvataggio del contesto, quindi l'oggetto otterrà l'ultimo 'NSManagedObjectID', e non verrà mai modificato. non dovresti preoccuparti degli ID esistenti allora, nemmeno tu hai cancellato l'oggetto perché nessun nuovo oggetto otterrà il vecchio ID. – holex

risposta

15

provare la URIRepresentation proprietà di NSManagedObjectID. questo è un ID univoco per l'attuale NSManagerObject ma fai attenzione fino a quando loNSManagedObjectnon viene salvato, ti dà un ID temporaneo solo, non permanente e potrebbero essere diversi. (Sto solo dicendo perché non so per che cosa e come si desidera utilizzare l'ID univoco.)

UPDATE # 1

questo non è un ID univoco immaginario solo, questo è puro URL univoco per ogni individuo NSManagedObject (come ogni file ha un URL univoco), utilizzandoli è possibile ritrovare l'originale NSManagedObject, dopo aver perso il puntatore. So che è difficile da capire, ma questo è il punto dello NSManagedObjectID e delle sue proprietà.

(se non si capisce come il CoreData ed i loro oggetti di lavoro, non si downvote la risposta. Si prega di leggere di più la documentazione al posto del downvoting inutile.)

UPDATE # 2

secondo il commento @NickLocking, vorrei estendere la parte in grassetto della mia risposta di cui sopra:

fino salvando ilNSManagedObjectContextper il nuovo e ancora non salvatoNSManagedObjectsolo un ID univoco temporaneo. Otterranno l'ID univoco permanente dopo che sono stati salvati alla prima volta.

+1

La rappresentazione di URIR cambia quando l'oggetto viene salvato per la prima volta. –

0

Gli unici identificatori univoci forniti automaticamente da CoreData sono l'ID oggetto, ma come è stato notato, cambierà dopo la creazione iniziale. Ma prima di andare fino a venire con un altro modo per ovviare a questo, si potrebbe prendere in considerazione la definizione di qualcosa di simile a quanto segue nella classe oggetto gestito:

- (NSManagedObjectID *)permID { 
    if ([[self objectID] isTemporaryID]) { 
     // Save myself, returning nil if there are errors 
    } 
    return [self objectID]; 
} 

Questo approccio non è perfetto con qualsiasi mezzo, soprattutto se si è necessario esporre l'ID permanente prima che l'oggetto si trovi in ​​uno stato in cui è valido e può essere salvato nel database. Ma ti permetterà di esporre un ID permanente in modo coerente fino a quando non ne hai bisogno prima che l'oggetto possa essere salvato.

+1

Il problema è che, salvando l'oggetto in questa istanza, altre parti della mia applicazione rilevano che è stato creato un nuovo oggetto e lo elaborano. Ciò significa, ad esempio, che viene creata una voce tableview senza campi impostati. –

3

Alla fine ho deciso che non esiste un buon modo per farlo, quindi ho appena creato un campo Unidentificatore univoco che applico un UUID su awakeFromInsert.

Il salvataggio dell'oggetto causa l'aggiornamento di altre parti della mia applicazione, in particolare NSFetchedResultsControllers, prima che l'oggetto venga completato. Ho provato brevemente NSManagedObjectContext's getPermanentObjectIds: withError: metodo, pensando che otterrebbe gli ID oggetto senza salvare il contesto, ma in realtà salva semplicemente il contesto.