Persistencia de datos en iOS

¿Que es la persistencia de datos en iOS?

En la mayoría de aplicaciones vamos a necesitar guardar datos, para ello vamos a usar persistencia de datos.

Son datos que debemos guardar ya sea en el propio dispositivo o en un servidor.

Estos datos estarán ahí cuándo el usuario abra de nuevo la aplicación una vez cerrada.

Tipos de persistencia

Podemos guardar datos en local o bien en un servidor.

Con independencia de respaldo o Backup en un servidor, para guardar datos de forma local podemos utilizar:

  • NSUserDefault
  • Carpetas de la SandBox
  • mySQL
  • Core Data

La SandBox

También podemos usar las diferentes carpetas de nuestra SandBox.

La SandBox o también llamada «caja de arena» es un espacio de almacenamiento único y exclusivo para cada App dentro de iOS.

Se llama así en referencia a la caja de arena dónde hacen «pipí» y «popó» los gatos, y que sólo hacen allí y no en otro sitio 😉

Está compuesta de las siguientes carpetas:

  • Documents
  • Library
  • tmp

Esto quiere decir que cada aplicación podrá guardar datos solamente en las carpetas que están dentro de la SandBox de la propia App.

Persistencia-de-datos-en-iOS

mySQL y Core Data

Tenemos una solución como mySQL que lo que hace es crear toda una base de datos SQL.

Por otra parte tenemos Core Data, que es una solución de Apple muy valida, y mucho más amigable que tratar con SQL.

Ambas soluciones requieren conocer los Frameworks de cada una de ellas, y su implementación requiere más desarrollo.

Tipos de archivo que podemos persistir

Podemos guardar desde un String, hasta una base de datos completa, pasando por diccionarios, arrays, etc.  Todo dependerá del modelo de datos de nuestra App.

Para cosas sencillas como puede ser almacenar unos ajustes de usuario, podemos usar la clase NSUserDefault, y guardar en local la información.

Igualmente para cosas sencillas pero un volumen de datos intermedio, podemos usar las carpetas Documents o Preferences.

Si nuestra aplicación requiere de un modelo de datos más sofisticado, siempre podemos usar Core Data.

Core Data crea una base de datos relacional, y la «conecta» con nuestra interfaz, de forma que además de tener una base de datos, tenemos también un gestor de contenidos.

La curva de aprendizaje de Core Data es elevada, de ahí que no sea una solución a implementar si verdaderamente no tenemos un gran volumen de datos por almacenar.

También podemos usar mySQL y trabajar con un modelo de datos  que requerirá el conocimiento del lenguaje SQL.

Muchas formas de almacenar datos de forma persistente

Lo primero que debemos estudiar es nuestro modelo de datos.

¿Son muchos datos? ¿Son datos relacionales? O quizá son unos pocos datos como ajustes de usuario o las puntuaciones y guardado de fases de algún juego.

En base a esto podremos establecer el criterio para seleccionar una forma de persistir u otra.

Ejemplo de NSUserDefaults

NSUserDefault es quizá la solución más utilizada para guardar pequeños datos como pueden ser los ajustes de usuario o algún dato de configuración de la propia App.

Imaginar que queréis guardar un dato que un usuario a introducido en un TextField, podríamos tener una interfaz como esta:

Persistencia-de-datos-en-iOS2

Bien, pues para guardar el valor que el usuario haya introducido en el TextField al pulsar el botón, lo primero que deberíamos hacer es declarar una variable de instancia a la clase NSUserDefault.

NSUserDefaults *seleccion;

Y en el método que ejecuta el botón podríamos programar algo como esto:

- (IBAction)guardar:(id)sender {
    
    //Guardar el string con una clave

    [seleccion setObject:[NSString stringWithFormat:@"%@",_textField.text] forKey:@"clave"];
    
    [seleccion synchronize];
}

NSUserDefault siempre va a guardar nuestro objeto, en este caso un string, pero podría ser un Array, un Diccionario, etc. siempre lo va a guardar con una key, que será la que tengamos que usar para recuperar ese determinado valor.

Por ejemplo para recuperar el valor guardado podríamos usar el método viewDidLoad y hacer algo así:

- (void)viewDidLoad
{
    [super viewDidLoad];
    
   seleccion = [NSUserDefaults standardUserDefaults];

    NSString *myString = [seleccion stringForKey:@"clave"];
    
    _label.text = myString;

}

Qué quieres guardar y dónde debes hacerlo

Ya sabes que es la SandBox, así que dependiendo de los datos que quieras guardar deberías usar una carpeta u otra.

Hay que tener en cuenta que no todas las carpetas sincronizan con iTunes, y que la carpeta Caches de la SandBox se borra cada cierto tiempo, así que ojo con guardar datos en esta ubicación. 😉

Las únicas carpetas que sincronizan con iTunes son Documents y Preferences.

Cómo desarrollador debes usar el guardado de datos en estas carpetas con responsabilidad, me refiero a que tengas claro que los datos que vas a persistir merece la pena la sincronización con iTunes, de forma que no haga más lenta la sincronización del dispositivo con iTunes de forma innecesaria, pues iría en perjuicio del usuario.

Si quieres seguir aprendiendo a crear Apps para iOS, apúntate a mi mini-training, tienes una cajita debajo de este post dónde puedes empezar a recibir este mini-curso. 😉

About The Author
iOS Developer & Instructor at CFE Apps. Enseño a crear aplicaciones iOS a todo el que quiera aprender.

4 Comments

  • FRANCISCO RAMIREZ 11/03/2015 @ 11:05

    Me ha gustado mucho este post. Es muy claro y sintetiza muy bien como contemplar la persistencia en ios. Buen trabajo

    • Sergio Becerril 11/03/2015 @ 20:07

      Hola Francisco,

      Gracias por visitar el Blog.

      Me alegra que te haya gustado la entrada, no hay nada mejor que recibir un comentario como el tuyo, pues me anima a seguir creando este blog 😉

      Gracias por comentar.

      Un abrazo.
      Sergio Becerril

  • Douglas 16/07/2016 @ 17:53

    Hola, Lo de usar tantos corchetes para el codigo y la forma de escribirlo se debe a que el codigo es viejo? Se ve bastante feo para entender.

    Ejemplo:
    NSString *myString = [seleccion stringForKey:@»clave»];

    • Sergio Becerril 16/07/2016 @ 18:11

      Hola Douglas,

      ¡Yep! ¡Muy viejo! Cerca de 36 años aproximadamente, es Objective-C.

      Gracias por visitar mi blog y por comentar.

      Un abrazo.
      Sergio Becerril

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.