2010-04-01 20 views
9

Tutti i dati sulla mia applicazione vengono estratti tramite un'API tramite JSON. La natura di una buona percentuale di questi dati è che non cambia molto spesso. Quindi, andare a fare richieste JSON per ottenere un elenco di dati che non cambia molto non sembrava molto allettante.JSON a Data Store persistente (CoreData, ecc.)

Sto cercando l'opzione più sensata per avere questo JSON salvato su iPhone in una sorta di archivio dati persistente. Ovviamente, un plus di persistere dei dati sarebbe quello di fornire quando il telefono non può accedere all'API.

Ho guardato a a fewexamples di interagire con JSON e CoreData, ad esempio, ma sembra che descrivano solo la trasformazione di NSManagedObjects in JSON. Se I può trasformare JSON in CoreData, il mio unico problema sarebbe poter modificare quei dati quando cambiano i dati dell'API.

(O, forse tutto questo è solo stupido.)

risposta

15

Per una lettura concettuale, si consiglia di leggere la documentazione su Efficiently Importing Data, in particolare "Trova-o-creare". See a previous similar question.

Acquisire JSON e salvarlo come dati principali in locale è altamente ragionevole. Come lo faccio è in due fasi:

  1. convertito JSON per i tipi di dati di cacao nativo (NSDictionary e NSArray)
  2. convertono NS * in oggetto Data Nucleo

Due buoni quadri per la conversione tra JSON e NS * sono json-framework e TouchJSON. L'esempio seguente è basato su json-framework.

Supponiamo di ottenere una serie di oggetti da JSON. Farebbe quindi fai:

NSArray *objects = [jsonStringYouGotFromServer JSONValue]; 
for (NSDictionary *_object in objects) { 
    CDObjectType *cdObject = [self cdObjectFromDictionary:_object]; 
    // cdObject is now a full-featured Core Data object 
} 

il cdObjectFromDictionary potrebbe essere qualcosa di simile:

- (CDObjectType *) cdObjectFromDictionary:(NSDictionary *)dict { 

    CDObjectType *object = [NSEntityDescription 
       insertNewObjectForEntityForName:@"Object" 
       inManagedObjectContext:moc]; 

    NSDictionary *attributes = [[NSEntityDescription 
     entityForName:@"Object" 
     inManagedObjectContext:moc] attributesByName]; 

    for (NSString *attr in attributes) {    
     [object setValue:[dict valueForKey:attr] forKey:attr];        
    } 

    return object; 
} 

È possibile che questo presuppone che i nomi degli attributi nel JSON e il modello Core Data sono le stesse e che i tipi di dati match (cioè i numeri JSON sono NSNumeri di Dati di base ecc.). Il codice sopra funziona bene anche se il modello cambia.

Il codice precedente non considera come verificare se l'oggetto esiste già localmente, ma è possibile immaginare come aggiungerlo. È necessario disporre di un ID oggetto di un modulo nel modello e vedere se l'oggetto esiste localmente prima di aggiungerlo o se è necessario aggiornare l'oggetto esistente.

1
  • Gli Accessors possono essere necessari quando ci sono molte relazioni.
  • È più efficiente utilizzare gli accessor che utilizzare il valore-chiave. (Internally Core Data può comunque utilizzare valore-chiave, quindi questo punto potrebbe non essere vero se questo è il caso.)
  • Utilizzando sottoclasse e proprietà, il compilatore può aiutarti a rilevare i problemi, mentre si utilizza il valore-chiave, i problemi verrà mostrato solo in fase di esecuzione e più difficile da risolvere.

Pertanto, è consigliabile suddividere in sottoclasse NSManagedObject e utilizzare proprietà e accessor generati.