2012-04-19 8 views
5

Sto tentando di archiviare/annullare l'archiviazione di NSManagedObjectIDs negli oggetti di dati di base in modo che la prossima volta che la mia app si avvia posso recuperare questi ID e usarli per recuperare oggetti specifici.qual è il modo corretto per archiviare un NSURL in Core Data?

ho provato "archiviazione", l'ID in questo modo:

//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]; 

E poi unarchiving come questo (sto solo andando per [ANYOBJECT] Perché io sto testando e c'è un solo a questo punto):

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

Ma quando provo ottenere l'URL schiena come sopra, ottengo la seguente eccezione:

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

L'attributo nell'entità è stato impostato tramite Xcode su "trasformabile" e ho lasciato il campo del valore del trasformatore in Xcode vuoto poiché la documentazione di Core Data sembra implicare se vuoto utilizza il trasformatore predefinito.

Cosa sto sbagliando?

+0

cosa ha a che fare questo con nsurl? – Chet

risposta

0

Ok ... E 'stato 14 ore dritto di codifica .. Sono un .. eh .. idiota:

ho dimenticato di accedere all'attributo nell'oggetto ArchivedID. Cioè:

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

dovrebbe essere

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

Anche questo funziona :) – kevboh

1

È possibile risolvere questo problema senza archiviare gli URL. Considera l'aggiunta di un flag booleano al tuo modello e contrassegna gli oggetti che desideri recuperare come veri, quindi recupera oggetti contrassegnati la prossima volta che l'app viene avviata.

Tuttavia, è possibile provare a ottenere la versione di stringa dell'URL con -absoluteString e memorizzarla.

+0

Se hai seguito questo approccio, assicurati di selezionare la casella "indicizzata" sull'attributo booleano poiché verrai recuperato in base a tale indicatore. – ma11hew28

-1

Mi piace quello che @kevboh suggerito. Si potrebbe anche considerare di memorizzare i numeri objectID di specifici NSManagedObject s in NSUserDefaults. Es .:

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

La modalità di kevboh funziona ma aggiunge un ulteriore livello di riferimento indiretto. Sto bene nel modo in cui lo stavo facendo, è solo che ho avuto un refuso. – SaldaVonSchwartz

0

Hmmm. Sembra che ci sia un modo molto più semplice per farlo con CoreData. Ricorda, CoreData è un grafico a oggetti. È buono a tenere traccia delle relazioni.

Perché non avere un'entità in CoreData che mantiene una relazione uno-a-molti con gli oggetti che ti piacciono? Quindi, puoi semplicemente inserire/rimuovere/cercare/iterare/qualunque cosa sulla raccolta di oggetti.

+0

Il metodo dell'URL archiviato consente il trasferimento degli ID tramite JSON, ecc. E se tengo un to-many agli oggetti, potrei anche scaricarli (sono in un to-many per iniziare). L'intero punto era di essere in grado di recuperarli appena in tempo senza creare un'intera ricerca, un predicato, qualcos'altro, – SaldaVonSchwartz

Problemi correlati