miércoles, 23 de abril de 2014

Crear carpetas en el sistema

Utilizar createDirectoryAtPath: withIntermediateDirectories: attributes: error

NSString *directorioTemp = NSTemporaryDirectory();

NSFileManager *fileManager = [[NSFileManager alloc] init];

NSString *ubicacion = [directorioTemp stringByAppendingPathComponent: @"directorionuevo"];

if([fileManager createDirectoryAtPath:ubicacion withIntermediateDirectories:YES attributes:nil error:&errorInfo]){

  NSLog(@"Almacenado correctamente");

}


Escribir y leer en Ficheros

Las clases Cocoa permiten almacenar información como por ejemplo, NSString, UIImage y NSData.

Se puede utilizar el método writeToFile: automatically: encoding: error:  de NSString para almacenar su contenido en el sistema de archivos.


Significado de los parámetros:



  • writeToFile, la ubicación del fichero.
  • automatically, valor Boolean si está establecdia YES primero escribe el fichero en un espacio temporal.
  • encoding, el encoding del texto que se va ha almacenar, normalmente UTF8, utilizando la constante NSUTF8StringEncoding.
  • error, puntero a un objeto NSError.

NSString *guardaEsteTexto = @"Este contenido lo almaceno en el fichero";

Bool grabado = [guardaEsteTexto writeToFile:destinationPath automatically:YES 

encoding:NSUTF8StringEncoding error:&errorInfo];


Si se quiere trabajar con URLs encapsularlo en una instancia de NSURL, utilizar el método

writeToURL: automatically: encoding: error: 


La instancia de un NSURL puede apuntar a los recursos (ficheros, directorios, etc) local o remotamente.

También es posible almacenar un NSArray en un fichero.

NSArray *arrayValores = @[@"valor1",@"valor2",@"valor3"];

NSString *ubicacion = [NSTemporaryDirectory() 
stringByAppendingPathComponent:@"nombrefichero.txt"];

if([arrayValores writeToFile:ubicacion automatically:YES]){

 NSArray *recuperarArray = [[NSArray alloc] initWithContentsOfFile:ubicacion];

}

Para almacenar NSArray debe de contener objetos de los siguientes tipos:


  • NSString
  • NSDictionary
  • NSArray
  • NSData
  • NSNumber
  • NSDate

Si se intenta insertar otros tipos de objetos en el array el contenido no será grabada en el directorio, porque el método primero valida que el contenido de objetos es uno de los anteriores.

La clase NSDictionary es muy similar a NSArray para almacenar información.





















Obtener las carpetas en el Dispositivo

Utilizar el método URLsForDirectory de la entidad clase NSFileManage.

Permite buscar directorios en el systema de directorios iOs.

Parámetros :

URLsForDirectory 

El directorio que se quiere obtener, pasando un valor de tipo NSSearchPathDirectory.

inDomains

Esta es donde se busca el directory. El valor de este parámetro debe de ser de tipo NSSearchPathDomainMask.


NSFileManager *fileManager= [[NSFileManager alloc] init];

NSArray *ubicaciones = [fileManager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask];

if(ubicaciones.count>0){
  NSURL *carpeta = ubicaciones[0];
}



Valores posibles de URLsForDirectory.


  • NSLibraryDirectory, la carpeta library de la app.
  • NSCachesDirectory, la carpeta chache de la app.
  • NSDocumentDirectory, la carpeta document de la app.

Valores de inDomains

  • NSUserDomainMask, la búsqueda a ejecutar en la carpeta del usuario.

Si quiere encontrar la carpeta tmp utilice NSTemporaryDirectory().

NSString *temporal = NSTemporaryDirectory();








Ficheros y Carpetas

La carpeta raíz (nombre_aplicacion.app) de todas las aplicaciones contienen varias carpetas.

La carpeta a pesar de tener extensión .app realmente es una carpeta. El contenido de los recursos de la aplicación reside en esa carpeta, los iconos de la aplicación, el fichero binario generado, etc.

Contenido de carpetas:

Documents: Esta carpeta es la destinación para todo el contenido de creado por el usuario. Contenido que la app ha generado, descargas, o ficheros creados no debería estar almacenado en esta carpeta.

Library: Utiliza este directorio para almacenar ficheros cacheados, preferencias de usuarios. Esta carpeta contiene otras carpetas que contienen ficheros.


  1. Library/Caches: En esta carpeta se puede almacenar datos que la app puede posteriormente generar de nuevo. El contenido de esta carpeta no se hace copia de seguridad por parte de iOs.
  2. Library/Preferences: Esta carpeta contiene las preferencias que la app quiere recordar entre las ejecuciones de la app.
  3. Library/Application Support: Los datos que la app crea, deben de almacenarse en esta carpeta. iOs realiza copias de seguridad de esta carpeta.
Temp: Ubicar ficheros temporales que la app puede crear, ficheros descargados, etc. 



martes, 15 de abril de 2014

Core Data (Ordenar Datos)

Para ordenar el managed object - registros - que obtenemos de un managed object context - base de datos -.

NSSortDescriptor permite ordenar por atributos - columnas - de una entidad.

NSSortDescriptor  *ordenAnyo = [[NSSortDescriptor alloc] 
  initWithKey:@"anyo" ascending:YES];

NSSortDescriptor  *ordenMes = [[NSSortDescriptor alloc] 
  initWithKey:@"mes" ascending:YES];

NSArray *ordenColumnas = [[NSArray alloc] initWithObject, ordenAnyo, ordenMes, nil];


fetchRequest.sortDescriptors = ordenColumnas;

El orden que asignamos en el array ordenColumnas es el orden establecido en la petición de datos fetchRequest.



Core Data (Eliminar Registros/Entidades)

Para eliminar un managed object  - similitud con una row en una tabla - de un managed object context - similitud de una base de datos -.

El método deleteObject del NSManagedObjectContext realiza esta operación de elimnación de un managed object.

NSArray *articulos = [self.managedObjectContext executeFetchRequest: fetchRequest error:&errorInfo];

// Eliminamos uno del array

Articulo *articulo = [articulos lastObject];

[self.managedObjectContext deleteObject:articulo];

// Antes de actualizar el managedObjectContext nos aseguramos el borrado

if([articulo isDeleted]) {

  NSError *errorInfo = nil;

  if([self.managedObjectContext save:&errorInfo]){

     NSLog(@"Actualizado el contexto");

 }


Core Data (Leer datos)

Para obtener los datos de tus entidades (tablas) utilizando Core Data.

Con NSFetchRequest 

1) Crear un NSFetchRequest

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];

2) Indicar la entidad a la que queremos acceder

NSEntityDescriptor  *entidad = [NSEntityDescriptor entityForName:@"Articulo" inManagedObjectContext: self.managedObjectContext];

3) Asignar a NSFetchRequest 

[fetchRequest setEntity:entidad];

4) NSError para almacenar la información del error, si se produce.

NSError *errorInfo = nil;

5) Llamar al método executeFetchRequest 

NSArray *articulos = [self.managedObjectContext executeFetchRequest: fetchRequest   error:&errorInfo];

6) Comprobar si hemos obtenido valores

if([articulos count] > 0){

  for(Articulo *articuloIn in articulos){
     NSLog(articuloIn.nombre);
  }
}

NSFetchRequest es similar a la sentencia Sql Select de las tablas tradicionales. Especifica la fila a obtener, una condición, el orden que retorna de la entidad (tabla) seleccionada.