2012-01-04 20 views
15

Estoy desarrollando una aplicación que guardará los datos en el sistema de archivos local. Los datos que se guardarán serán en su mayoría NSString y NSDate. Los datos no se guardarán con tanta frecuencia, quizás se ingresarán nuevos datos 10 veces con un uso típico. Los datos también deberían ser recuperables (CRUD)iOS estrategia de almacenamiento persistente

¿Cómo debo guardar estos datos? En primer lugar, ¿es necesario modelar estos objetos? Si no, ¿debería usar listas de propiedades? ¿O SQLLite3?

¿Debo archivar los modelos de clase? Use SQLLite3?

EDITAR: Accidentalmente omití información vital sobre la aplicación. En realidad, mi aplicación tendrá dos modelos de datos que tienen una relación agregada. Entonces mi primer modelo de datos (vamos a llamarlo DataA) que tendrá un NSString y NSDate también tendrá una referencia al segundo modelo de datos (vamos a llamarlo DataB), que a su vez consistirá en un NSString y un NSArray. Entonces se vuelve un poco más complicado ahora. Si un objeto de DataB se elimina, debería dejar de existir en DataA (pero el resto de DataA no debería tocarse)

+0

si la cantidad de datos no es enorme, como está diciendo ... puede usar NSUserDefaults ... Es simple y fácil de usar. – Bonnie

Respuesta

17

Este tipo de datos parece ser muy simple de almacenar y recuperar y no tiene ningún otro dependencias tales como un gráfico de objetos horriblemente complejo.

Debe almacenar esta información en un archivo plano o en NSUserDefaults.

te voy a dar un ejemplo de ambos, usando el archivo objeto con el uso del protocolo de NSCoding:

@interface ApplicationData <NSCopying, NSCoding> {} 

@property (nonatomic, strong) NSDate *someDate; 
@property (nonatomic, strong) NSDate *someOtherDate; 

@property (nonatomic, copy) NSString *someString; 
@property (nonatomic, copy) NSString *someOtherString; 

@end 

@implementation ApplicationData 

@synthesize someDate = _someDate, someOtherDate = _someOtherDate, someString = _someString, someOtherString = _someOtherString; 

- (NSArray *)keys { 
    static dispatch_once_t once; 
    static NSArray *keys = nil; 
    dispatch_once(&once, ^{ 
     keys = [NSArray arrayWithObjects:@"someString", @"someOtherString", @"someDate", @"someOtherDate", nil]; 
    }); 
    return keys; 
} 

- (id) copyWithZone:(NSZone *) zone { 
    ApplicationData *data = [[[self class] allocWithZone:zone] init]; 
    if(data) { 
     data.someString = _someString; 
     data.someOtherString = _someOtherString;  

     data.someDate = _someDate; 
     data.someOtherDate = _someOtherDate; 
     //... 
    } 
    return data; 
} 

- (void) encodeWithCoder:(NSCoder *) coder { 
    [super encodeWithCoder:coder]; 

    NSDictionary *pairs = [self dictionaryWithValuesForKeys:[self keys]]; 

    for(NSString *key in keys) { 
     [coder encodeObject:[pairs objectForKey:key] forKey:key]; 
    } 
    } 


    - (id) initWithCoder:(NSCoder *) decoder { 
    self = [super initWithCoder:decoder]; 
    if(self) { 
     for(NSString *key in [self keys]) { 
      [self setValue:[decoder decodeObjectForKey:key] forKey:key]; 
     } 
    } 
    return self; 
    } 

    @end 

Entonces, dicen en su delegado aplicación, se puede hacer esto:

@interface AppDelegate (Persistence) 

@property (nonatomic, strong) ApplicationData *data; 

- (void)saveApplicationDataToFlatFile; 
- (void)loadApplicationDataFromFlatFile; 
- (void)saveApplicationDataToUserDefaults; 
- (void)loadApplicationDataFromUserDefaults; 

@end 

@implementation AppDelegate (Persistence) 
@synthesize data; 

- (NSString *)_dataFilePath { 
    static NSString *path = nil; 
    static dispatch_once_t once; 
    dispatch_once(&once, ^{ 
    path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) stringByAppendingPathComponent:@"xAppData.dat"]; 
    }); 
    return path; 
} 

- (void)loadApplicationDataFromUserDefaults {   
    NSData *archivedData = [[NSUserDefaults standardUserDefaults] objectForKey:@"appData"]; 
    self.data = [NSKeyedUnarchiver unarchiveObjectWithData:archivedData]; 
} 

- (void)saveApplicationDataToUserDefaults { 
    NSData *archivedData = [NSKeyedArchiver archivedDataWithRootObject:self.data]; 
    [[NSUserDefaults standardUserDefaults] setObject:archivedData forKey:@"appData"]; 
    [[NSUserDefaults standardUserDefaults] synchronize]; 
} 

- (void)loadApplicationDataFromFlatFile { 
    NSData *archivedData = [NSData dataWithContentsOfFile:[self _dataFilePath]]; 
    self.data = [NSKeyedUnarchiver unarchiveObjectWithData:archivedData]; 
} 

- (void)saveApplicationDataToFlatFile { 
    NSData *archivedData = [NSKeyedArchiver archivedDataWithRootObject:self.data]; 
    [archivedData writeToFile:[self _dataFilePath] atomically:YES]; 
} 

@end 

Descargo de responsabilidad: No he probado este código.

+0

Gracias por su minuciosa respuesta. En realidad, mi aplicación tendrá dos modelos de datos que tienen una relación agregada. Entonces mi primer modelo de datos (vamos a llamarlo DataA) que tendrá un NSString y NSDate también tendrá una referencia al segundo modelo de datos (vamos a llamarlo DataB), que a su vez consistirá en un NSString y un NSArray. Entonces se vuelve un poco más complicado ahora. Si un objeto de DataB se elimina, debería dejar de existir en DataA. –

+0

@PeterWarbo Si ese es el caso, te aconsejo que uses Core Data porque sería la forma más fácil de hacer reglas de relación en cascada y cosas así. Debería ser muy simple de implementar, aunque soy escéptico acerca de la compensación de configurar una pila de datos básicos solo para hacer eso ... –

+0

¿Básicamente todo se reduce a usar el archivo de mis modelos de datos o usar Core Data? –

1

Yo sugeriría que vaya con NSUserDefaults. Seguramente es el mejor enfoque para almacenar información relacionada con su aplicación y cualquier información relacionada con la aplicación. ¡¡Compruebe el documentation !!

1

NSUserDefault es una buena opción si solo tiene un conjunto limitado de datos. Pero si considera la posibilidad de filtrar y buscar, entonces debe echarle un vistazo a Datos básicos para almacenar objetos.

Incluso si el gráfico de objeto es mínimo, obtendrá la gestión de objetos en caché y la gestión de deshacer/rehacer.

Cuestiones relacionadas