Domanda

Ho un dizionario di oggetti; sono tutti gli oggetti che dovrebbero essere POCO serializzabile. Che tecnica che dovrebbe guardare per la scrittura su disco questi. Sto cercando l'opzione più semplice di scrivere un paio di liste per salvare lo stato.

Credo di avere 3 opzioni.

  1. file plist. Tuttavia, questo sembra essere limitata a memorizzare solo gli oggetti predefiniti (stringhe, numeri, ecc) non oggetti (come una persona con un nome ed età).

  2. CoreData. (Nuova in 3.0) Questo potrebbe funzionare bene; Tuttavia il mio modello di dati avrebbe bisogno di cambiare per fare questo lavoro. Questa sarebbe una rielaborazione massiccia e non sono sicuro se è valsa la pena.

  3. SqlLite. Implementare un semplice database SQL per leggere da e per. Ho fatto il minor numero di Reserch in questo, ma io non voglio avere a 'riscrivere' alcune delle funzioni di base dati di ORM.

È stato utile?

Soluzione

A tale scopo, nello stesso modo lo faresti su Mac OS X: i tuoi Pocos devono essere conformi al protocollo NSCoding. Vedi qui per un riferimento concettuale e qui per il riferimento NSCoding.

Se i dati non è che pazzo ampia e non avere rapporti ridicolmente complicate tra gli oggetti, scrivere tutto come un plist è probabilmente la scelta migliore; è molto veloce da eseguire e semplice da implementare nel codice. Come hai detto tu, CoreData sarà probabilmente un molto di lavoro extra per adattarsi il codice per, e SQLite è veramente buono solo per la memorizzazione dei dati che è perfetto per essere memorizzati in un database relazionale. Tenete a mente che SQLite è anche più lento e utilizza più risorse di lavorare con plists binari.

Altri suggerimenti

Per serializzare oggetto personalizzato che solo bisogno di conformarsi al protocollo NSCoding. Se l'oggetto si estende NSObject tutto quello che dovete fare (credo) è quello di attuare tali (ad esempio a persona oggetto):

// Encode an object for an archive
- (void)encodeWithCoder:(NSCoder *)coder
{
    [super encodeWithCoder:coder];
    [coder encodeObject:name forKey:@“Name”];
    [coder encodeInteger:age forKey:@“Age”];
}
// Decode an object from an archive
- (id)initWithCoder:(NSCoder *)coder
{
    self = [super initWithCoder:coder];
    name = [[coder decodeObjectForKey:@“Name”] retain];
    age  = [coder decodeIntegerForKey:@“Age”];
}

NSArray e NSDictionary già implementare metodi per la serializzazione. Essi serializzare tutti gli oggetti che in loro possesso (se gli oggetti implementano l'interfaccia NSCoder - fanno se si estendono NSObject). encodeWithCoder e initWithCoder di NSObject non fanno nulla per default in modo meno che non si sceglie di implementare il proprio codice nelle classi nulla viene serializzato.

Se avete NSArray o NSDictionary di oggetti è possibile sincronizzare usando:

// Writing
- (BOOL)writeToFile:(NSString *)aPath atomically:(BOOL)flag;
- (BOOL)writeToURL:(NSURL *)aURL atomically:(BOOL)flag;
// Reading
- (id)initWithContentsOfFile:(NSString *)aPath;
- (id)initWithContentsOfURL:(NSURL *)aURL;

NSCoder è l'idioma di cacao standard per la serializzazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top