2010-11-04 15 views
24

Ho le basi per inserire record ed eliminare record con Core Data; tuttavia, apprezzerei l'aiuto con una delle funzioni più comuni: l'inserimento/aggiornamento .Come eseguire un inserimento/aggiornamento con i dati principali

Fondamentalmente, utilizzo NSMutableArrayarrayWithContentsOfURL per ottenere un array che contiene righe da una tabella mysql. Quello che devo fare è ora sincronizzare il mio negozio CoreData.

In altre parole, ho bisogno di aggiungere ogni riga dell'array alla mia tabella CoreData ma se esiste già devo aggiornare il record con i valori più recenti. Inoltre, se esiste nei Core Data e non nell'array scaricato, dovrei eliminarlo.

Probabilmente ho potuto hackerarlo insieme; tuttavia, mi piacerebbe vedere come è fatto in modo corretto ed efficiente senza perdite di memoria.

+0

so che è tardi, ma se si eliminano elementi dai dati principali che non esistono nell'array, perché non si eliminano tutti gli elementi dai dati principali e si inseriscono tutti quelli nuovi. inserire vs aggiornare quelli esistenti è probabilmente molto più semplice. – Ben

+0

@ Ben: buon suggerimento, ma non sarebbe potenzialmente molto più lento? Soprattutto nel caso di una tabella con molte voci e solo una coppia che deve essere cambiata. Fare così tanto scrivere quando non ne hai bisogno potrebbe essere significativo, giusto? – GeneralMike

+0

@GeneralMike sì sicuramente più efficiente se hai un sacco di file. Non avevo ancora imparato il modo corretto per farlo :) – Ben

risposta

34

Ci sono due modi per inserire i dati in Core Data - e quello che usi dipende da te. Tuttavia, uno di essi dipende dal fatto che siano state generate classi di modello per il modello di dati per il db di Core Data.

Il modo regolare è quello di utilizzare il seguente:

NSManagedObject *object = [NSEntityDescription insertNewObjectForEntityForName:@"table" 
inManagedObjectContext:context]; 
[object setValue:@"value1" forKey:@"stringColumn"]; 
[object setValue:12 forKey:@"numberValue"]; 
NSError *error; 
if (![context save:&error]) { 
    NSLog(@"Failed to save - error: %@", [error localizedDescription]); 
} 

Ciò presuppone che hai già il tuo contesto oggetto gestito imposta. È molto più efficiente se si creano e si inseriscono gli oggetti nel contesto in un ciclo e quindi si salvano al termine del ciclo.

L'altro metodo non è molto diverso, ma è molto più sicuro in termini di sicurezza del tipo. Se hai generato classi di modelli (che puoi fare da xcdatamodels), puoi semplicemente creare un oggetto di quella classe e impostarne le proprietà.

TableObject *object = [NSEntityDescription insertNewObjectForEntityForName:@"table" 
inManagedObjectContext:context]; 
[object setStringColumn:@"value1"]; 
[object setNumberValue:12]; 
NSError *error; 
if (![context save:&error]) { 
    NSLog(@"Failed to save - error: %@", [error localizedDescription]); 
} 

Per eliminare da una tabella, è sufficiente recuperare l'oggetto dalla tabella (sto assumendo che si sta utilizzando il secondo metodo qui per inserimenti, e come tali hanno generato classi del modello) e utilizzare il seguente:

[context deleteObject:object]; 

Nota che è necessario chiamare il salvataggio per fare in modo che abbiano effetto.

Spero che questo aiuti! In bocca al lupo!

MODIFICA: Mi spiace, devo aver letto male la domanda!

Per esaminare un record esistente, è necessario creare una richiesta di recupero e quindi eseguirla nel contesto dell'oggetto gestito. Al minimo, una richiesta di recupero richiede un'entità (quindi sa su quale tabella cercare). Per specificare i termini di ricerca, è necessario creare un predicato (altrimenti la richiesta restituirà semplicemente tutto nella tabella). È inoltre possibile specificare un set di descrittori di ordinamento in modo che i risultati vengano ordinati.

NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"table" inManagedObjectContext:context]; 
[request setEntity:entity]; 

NSError *errorFetch = nil; 
NSArray *array = [context executeFetchRequest:request error:&errorFetch]; 

Questo codice crea una richiesta di recupero e restituisce ogni oggetto dalla tabella denominata "tabella" in una matrice. Da qui, poiché tutti gli oggetti richiesti sono nell'array, è possibile ispezionare e modificare i record. Se apporti modifiche, ricorda di salvare il contesto! Il seguente ciclo registra il primo valore in ciascun oggetto, utilizzando la stessa tabella degli esempi precedenti.

for(TableObject *object in array) 
{ 
    NSLog(@"object value1 = %@", object.value1); 
} 

È anche possibile eliminare record da questo punto utilizzando la funzione sopra indicata.

Per ulteriori informazioni sulle richieste di recupero, si prega di dare un'occhiata al class reference. Raccomanderei inoltre di leggere i descrittori di ordinamento e i predicati, poiché sono molto importanti per la ricerca dei dati di base di DB e alcuni loro usi sono meno efficienti di altri (in particolare nella creazione di NSPredicates).

Buona fortuna!

+0

Ciao Andrew, grazie per la risposta. Ho già capito come inserire i record in Core Data usando NSManagedObject come menzionato nella domanda. Sto cercando aiuto con il codice per esaminare i record già presenti in Core Data, quindi aggiornarli, eliminarli o inserirne di nuovi in ​​base ai record in un NSMutableArray scaricato. – slevytam

Problemi correlati