2015-04-02 4 views
5

Facciamo questo esempio:Elimina il modello dal reame ma mantieni vivo l'oggetto

Lavoriamo con un set di animali. Supponiamo di non aver bisogno che tutti gli animali persistano nel database, e c'è una logica che controlla l'aggiunta e la rimozione di animali dal database.

Ad esempio, ho un oggetto, un cavallo, con la proprietà stringa name con "Suey" e l'ho aggiunto al dominio con addObject:. Così ora abbiamo questo oggetto salvato in Realm. Questo oggetto è valido e possiamo fare horse.name, che restituirà "Suey".

Quello che succede dopo è che ho bisogno di rimuovere Suey dal DB. Faccio deleteObject:. Purtroppo, rimuove non solo le informazioni persistenti sul cavallo, ma ha anche reso invalido il mio oggetto. Suey è praticamente morto, quindi se la rivoglio nel DB ho bisogno di creare un altro cavallo da zero, e solo dopo potrò avere un altro Suey nel DB.

C'è un altro modo per mantenere in vita Suey, quindi ho più flessibilità nella gestione del suo stato?

Spero di aver chiarito il punto, per favore fatemi sapere se avete domande.

Grazie in anticipo!

UPDATE

il cavallo è impegnato in uno-a-molti, quindi è durata della vita anche impatti immobili a modelli correlati.

+0

Esiste una relazione uno-a-molti? Esiste la possibilità di aggiungere più ore come "Suey" e "Duey"? In caso contrario, invece di eliminare l'oggetto, è possibile impostare il valore del nome su zero. E mentre aggiungi se l'oggetto è lì puoi impostare la proprietà name invece di addObject. – Samir

+0

Sì, ci sono relazioni uno-a-molti. Aggiornerò la domanda, grazie. – Dumoko

risposta

1

Gli oggetti nel reame sono accessors per l'oggetto equivalente nel database. Se per qualsiasi motivo, è necessario "staccare" la variabile oggetto dalla sua rappresentazione su disco, è possibile copiarla in memoria. Un modo semplice per farlo è quello di creare un nuovo oggetto non-persistito con i contenuti del persistito uno:

// Assuming `Horse` inherits from `RLMObject` and `persistedHorse` is attached to an `RLMRealm`. 
Horse *persistedHorse = ...; 
Horse *inMemoryHorseCopy = [[Horse alloc] initWithObject:persistedHorse]; 
// This will create a new `Horse` object, not tied to an RLMRealm, 
// by copying the contents of `persistedHorse`. 

È possibile utilizzare lo stesso approccio ogni volta che è necessario copiare una esistente RLMObject sia in una stand- oggetto solo (come sopra) o in un altro regno.

+0

Ho notato che l'oggetto Realm non implementa il protocollo 'NSCoding', quindi in pratica l'idea è di implementare qualcosa come il metodo' -copy'. Ok, grazie per aver condiviso l'idea, terrò a mente che questo è il modo di "staccare". Grazie! – Dumoko

1

Secondo lo documentation ogni modifica dell'oggetto oggetto della query (nel caso specifico Oggetto cavallo con nome Suey) modifica direttamente i dati sul disco perché il risultato sono i dati effettivi e non una copia di esso. Quindi se rimuovi il cavallo devi crearne uno nuovo.