Blog
>Lista ejercicios >
Ejercicio 23
Ejercicio 23 : Accediendo al directorio Documents de nuestro proyecto
Acceder al directorio de la aplicación:
El directorio de la aplicación nos permiten guardar datos en cuatro lugares distintos :
- DOCUMENTS : Ubicación principal donde la aplicación guarda sus datos.
- PREFERENCES : No ha sido creado para manipular directamente los archivos.
- CACHES : Guarda temporalmente los archivos que tienen que existir cuando se abre la aplicación.
- TMP : Se usa para guardar los archivos temporales innecesarios una vez se abre la aplicación.
Las aplicaciones son las encargadas y únicas responsables de
limpiar el contenido de estas carpetas para que el dispositivo se encuentre optimizado.
NSSearchPathForDIrectoriesInDomains : Sirve para obtener la ruta de los directorios Caches y Documents. La función devuelve una instancia de NSArray con el listado de directorios.
NSTemporalyDirectory : Sirve para obtener la ruta de la carpeta tmp.
stringByAppendingPathComponent:@"Datos.dat" : Nos permite acceder a Datos.dat contenido en un directorio en concreto.
CLASE NSFileManager
Sólo puede haber una instancia única durante el ciclo de vida de la aplicación. Esta es la clase que nos permite manipular los archivos contenidos en los directorios de la aplicación.
Una vez leida esta pequeña introducción, vamos a empezar con el ejercicio.Comenzamos agregando una nueva clase de Objective C que herede de NSObject,hay que destacar que si hay alguna referencia a outlets no funcionará.Además hacemos que herede de NSCoding
En el .h creamos 2 variables para almacenar los datos, una para el nombre y otra para el teléfono.
NSCoding nos obliga a usar dos métodos de instancia encodeWithCoder y initWithCoder, cada uno de estos métodos codifican y decodifican sus propiedades. Para que quede más claro es como crear una especie de "almacen".
Un objeto puede recibir estos métodos cualquier número de veces. initWithCoder instruye al objeto para inicializar a partir de datos del codificador proporcionado sustituyendo a cualquier otro método de inicialización y sólo se envía una vez al objeto.
.h
// Datos.h
// Documents
//
// Created by makone moreno on 20/09/14.
// Copyright (c) 2014 makone moreno. All rights reserved.
//
#import
@interface Datos : NSObject
@property (nonatomic,strong) NSString *nombre;
@property (nonatomic,strong) NSString *telefono;
@end
.m
// Datos.m
// Documents
//
// Created by makone moreno on 20/09/14.
// Copyright (c) 2014 makone moreno. All rights reserved.
//
#import "Datos.h"
@implementation Datos
@synthesize nombre;
@synthesize telefono;
//METODO PARA INICIALIZARLAS, SUPERCLASE
-(id)initWithCoder:(NSCoder *)aDecoder{
if (self = [super init]){
nombre = [aDecoder decodeObjectForKey:@"nombre"];
telefono = [aDecoder decodeObjectForKey:@"telefono"];
}
return self;
}
//METODO QUE SIRVE PARA CODIFICAR LAS VARIABLES DEL OBJETO
- (void)encodeWithCoder:(NSCoder *)aCoder{
[aCoder encodeObject:nombre forKey:@"nombre"];
[aCoder encodeObject:telefono forKey:@"telefono"];
}
@end
Abrimos nuestro storyboard e insertamos un botón, creamos la conexión y creamos un NSArray para guardar los contactos del telefono.
.H
// ViewController.h
// Documents
//
// Created by makone moreno on 20/09/14.
// Copyright (c) 2014 ___FULLUSERNAME___. All rights reserved.
//
#import
#import "Datos.h"
@interface ViewController : UIViewController
@property (strong, nonatomic)NSArray *lista;
- (IBAction)BotonGuardar:(id)sender;
@end
.M
// ViewController.m
// Documents
//
// Created by makone moreno on 20/09/14.
// Copyright (c) 2014 ___FULLUSERNAME___. All rights reserved.
//
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
@synthesize lista;++
- (void)viewDidLoad
{
[super viewDidLoad];
//OBJETO PARA ALMACENAR RUTA
NSArray *ruta= NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
//RUTA DOCUMENTS
NSString *directorioDocuments = [ruta objectAtIndex:0];
//BUSCAMOS EL ARCHIVO DatosContacto.dat
NSString *rutaArchivo = [directorioDocuments stringByAppendingPathComponent:@"DatosContacto.dat"];
//MENSAJE PARA SABER SI EL ARCHIVO EXISTE
if([[NSFileManager defaultManager] fileExistsAtPath:rutaArchivo]==NO){
UIAlertView *msgError = [[UIAlertView alloc] initWithTitle:@"DatosContacto.dat no encontrado" message:@"Creandolo..." delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
[msgError show];
//CONTACTO1
Datos *d1 = [[Datos alloc]init];
d1.nombre = @"Paca";
d1.telefono = @"666666666";
//CONTACTO2
Datos *d2 = [[Datos alloc]init];
d2.nombre = @"Eugenia";
d2.telefono = @"777777777";
//CONTACTO3
Datos *d3 = [[Datos alloc]init];
d3.nombre = @"Atapuerca";
d3.telefono = @"888888888";
lista = [NSArray arrayWithObjects:d1,d2,d3, nil];
}else{
//SI EL ARCHIVO EXISTE NO HAY QUE CREARLO, SIMPLEMENTE RECOGEMOS LOS CONTACTOS
lista = [NSKeyedUnarchiver unarchiveObjectWithFile:rutaArchivo];
//CREAMOS MENSAJE
NSString *mensaje = [NSString stringWithFormat:@"Cargados %d objetos", [lista count]];
//VENTANA DE AVISO
UIAlertView *toast= [[UIAlertView alloc] initWithTitle:@"Archivo encontrado!" message:mensaje delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
[toast show];
}
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (IBAction)BotonGuardar:(id)sender {
NSArray *ruta = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
//RUTA DOCUMENTS
NSString *directorioDocuments = [ruta objectAtIndex:0];
//BUSCAMOS EL ARCHIVO DatosContacto.dat
NSString *rutaArchivo = [directorioDocuments stringByAppendingPathComponent:@"DatosContacto.dat"];
//ALMACENAMOS EN UNA VARIABLE BOOLEANA EL RESULTADO DE SI SE HA ENCONTRADO O NO EL ARCHIVO
BOOL result = [NSKeyedArchiver archiveRootObject:lista toFile:rutaArchivo];
if (result == YES) {
UIAlertView *msgError = [[UIAlertView alloc] initWithTitle:@"El archivo ya ha sido guardado" message:@"Creandolo..." delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
[msgError show];
}else{
UIAlertView *msgError = [[UIAlertView alloc] initWithTitle:@"Error al guardar el archivo" message:@"" delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
[msgError show];
}
}
@end
Bien, vemos el resultado, la primera vez que se ejecuta la aplicación, no está creado el archivo, entonces :
Si pulsamos en el botón guardar, veremos esto :
Y por último, si volvemos a ejecutar la aplicación, veremos que ya se ha creado el archivo anteriormente :