2013-02-14 17 views
5

Alcuni retroscena:Hai bisogno di alcuni chiarimenti in merito refreshObject: mergeChanges: SI

Sto cercando di memorizzare una grande quantità di dati in DB locali e voglio farlo nel modo più efficiente possibile.

Scenario:

Ci sono molte entità che sono correlati tra loro, come l'indirizzo è associato a un contatto del genere:

indirizzo < < -> contatto

Per gestire le relazioni, ho scritto un metodo in ciascuna sottoclasse di NSManagedObject, di seguito è riportato un frammento di codice:

// class Contact 
- (void)manageRelationships 
{ 
    @autoreleasepool { 
     LocalDBManager *localDBManager = [[LocalDBManager alloc] init]; 

     // managing relationships 

     // map associated addresses 

     NSPredicate *addressIdPredicate = [NSPredicate predicateWithFormat:@"%K == %@",ADDRESSID,self.addressid]; 

     // below method returns an object as fault by firing a fetch request against context 
     NSSet *retrievedAddresses = [localDBManager retrieveManagedObjectsForEntity:ADDR_ENTITY withPredicate:addressIdPredicate asFault:YES withPropertyValues:NO error:nil]; 
     self.addresses = retrievedAddresses; 


     // managing few more relationships   
    } 

} 

punto da considerare:

Poiché non vi può essere di più i rapporti di un oggetto, lo so che il consumo di memoria aumenta quando sarò rapporti di mappatura.

Domanda:

voglio tornare indietro un oggetto in colpa, senza perdere alcuna modifica fatti, una volta che i rapporti sono mappati.

Dalla documentazione Apple e alcuni googling sono venuto a sapere che posso utilizzare refreshObject: mergeChanges: metodo. Così sto progettando di aggiungere sotto la linea alla fine del blocco di codice nel metodo manageRelationships:

[[self managedObjectContext] refreshObject:self mergeChanges:YES]; 

Sono un po 'confuso e voglio sapere che -

Vuol dire che sono state apportate tutte le modifiche al l'oggetto sarà memorizzato nell'archivio permanente e quindi l'oggetto si trasformerà in un errore? Se sì, allora posso considerare equivalente a salvare il metodo di NSManagedObjectContext

Si prega di suggerire.

+0

ottenendo lo stesso problema! hai trovato qualche soluzione per questo scenario? – Bucket

risposta

11

Prima di tutto non è necessario gestire le relazioni da soli. Lascia che CoreData lo gestisca.

Core Data risolve automaticamente (attiva) l'errore quando si accede ai dati nell'anomalia. Questo lazy loading di gli oggetti correlati è molto meglio per l'utilizzo della memoria, e molto più veloce per il recupero di oggetti relativi agli oggetti usati raramente (o molto grandi). CoreData performance

Si potrebbe fare questo semplice istanziando relazione uno-a-molti tra il contatto-indirizzo.

Riguardo a refreshObject: mergeChanges: si sono sbagliati.Non è un equivalente per salvare: metodo. Se si imposta unire le modifiche su YES significa solo che:

Se la bandiera è sì, allora i valori delle proprietà dell'oggetto vengono ricaricati dai valori dal negozio o l'ultimo stato memorizzato nella cache tutte le modifiche che sono state fatte (in locale contesto) vengono applicati nuovamente a quei valori (ora appena aggiornati). Cocoa touch Doc

Quindi, se avete fatto alcuni cambiamenti nel oggetto gestito A e poi ha fatto [contesto refreshObject: A mergeChanges: SI] di oggetto A sarebbe ancora rimanere in uno stato non salvato.

+0

ciao Mark .. thnx per chiarimenti :-) – Devarshi

Problemi correlati