iOS : Ejercicio 23. Acceder al directorio Documents de nuestro iPhone


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 :







Compartir Compartir Compartir Compartir 


Thebestandroide Indice Thebestandroide Ejercicio anterior Thebestandroide Siguiente ejercicio

0 comentarios:

Publicar un comentario