logoImagina

Crear una aplicación con SQLite en iOS 6 (Parte 1)

iconImage
Publicado 2024-03-01
Actualizado el 2024-03-01

Crear una aplicación para operaciones básicas con SQLite en iOS

Parte 1: Crear la base de datos y mostrar datos en una tabla

En el siguiente tutorial vamos a explicar cómo crear una aplicación sencilla que nos permita realizar las cuatro operaciones básicas contra una base de datos SQLite: altas, bajas, modificaciones y consultas. En esta primera parte del tutorial, vamos a crear la base de datos mediante un gestor, introducir algunos datos de prueba y luego crear una aplicación que muestre estos datos en la pantalla de nuestro dispositivo mediante una tabla.

Paso 1: Crear la base de datos

1.1 Descargar un gestor de SQLite

En primer lugar, necesitamos descargar un gestor de SQLite. Recomendamos el addon de Firefox llamado "SQLite Database Manager". Si no utilizas Firefox, puedes descargar otro gestor desde SQLAbs.

1.2 Crear una nueva base de datos

Ejecuta el addon de SQLite Database Manager y crea una nueva base de datos. Asegúrate de elegir un nombre para la base de datos y guarda el archivo .sqlite en la ubicación deseada.

Crear nueva base de datos desde SQLite Manager

Elegimos el nombre que queramos. Una vez aceptemos, nos creará un fichero .sqlite con el nombre que hayamos elegido en la ubicación que queramos. Para este tutorial, hemos elegido el nombre vehiculos.sqlite.

1.3 Crear la tabla en la base de datos

A continuación hacemos click en el botón de Crear Tabla y podremos crear la primera tabla de nuestra nueva base de datos. Utiliza los siguientes campos para la tabla:

  • ID (tipo: INTEGER)
  • Nombre del vehículo (tipo: TEXT)
  • Número de ruedas (tipo: INTEGER)
Creamos la tabla de la base de datos con los campos indicados

Paso 2: Insertar datos de prueba en la tabla

2.1 Abrir la tabla en el gestor de base de datos

Despliega la sección de tablas en el gestor de base de datos y selecciona la tabla que has creado.

2.2 Añadir datos de prueba

Con nuestra tabla seleccionada, en la parte derecha de la ventana veremos un botón que nos permitirá añadir una nueva fila a la tabla. En la siguiente imagen vemos de qué botón se trata:

Añadir una nueva fila a la tabla con el botón Añadir

Nos aparecerá una ventana con los tres campos de la tabla para rellenar. Insertamos los datos que queramos (para este tutorial, con tres vehículos nos bastará) rellenando todos los campos y confirmando los cambios cuando el programa nos lo pida. Repetimos la operación hasta completar el número de vehículos que queramos. Para finalizar, una vez hayamos insertado el último, hacemos click en el botón de cancelar y nos aparecerá lo siguiente por pantalla:

Vista de la base de datos

Con esto terminan nuestras operaciones con el gestor de base de datos.

Paso 3: Crear el proyecto en Xcode

3.1 Crear un proyecto de Xcode

A continuación vamos a crear el proyecto de XCode con el que crearemos nuestra aplicación. Elegimos un proyecto de tipo Single View Application y lo nombramos como queramos, en este caso hemos elegido el nombre VehiculosCRUD.Indicaremos que la aplicación será para iPhone, utilizará Storyboards y también utilizará ARC.

3.2 Añadir la librería SQLite

Dirígete a la sección "Linked Frameworks and Libraries" en la configuración del proyecto y añade una nueva entrada utilizando el botón "+". Busca y añade la librería "libsqlite3.0.dylib" a tu proyecto.

3.3 Añadir el archivo de base de datos al proyecto

Ahora, buscamos el fichero que contiene nuestra base de datos, la cual hemos creado antes. Busca el archivo .sqlite que has creado anteriormente y arrástralo a la lista de archivos del proyecto en Xcode. Asegúrate de seleccionar las opciones correctas en la ventana que aparece, tal y como muestra la imagen:

Opciones pata añadir los archivos

Paso 4: Crear las clases para las operaciones con la base de datos

Ahora vamos a crear las operaciones.

4.1 Crear la clase Vehiculo

Primero crearemos un grupo y lo haremos desde el menú File y seleccionando la opción New Group. Le pondremos como nombre modelo. Una vez creado el nuevo grupo, crearemos la clase que nos mapeará la tabla de vehiculo. La clase la crearemos seleccionando el nuevo grupo y, desde el menú contextual, seleccionaremos New File. Elegimos Objective-C class, le indicamos que será una subclase de NSObject y la llamaremos Vehiculo. Una vez la creemos, le añadimos las propiedades necesarias para mapear los campos de la tabla de base de datos, tal y como podemos ver en el siguiente código:

Vehiculo.h
#import
@interface Vehiculo : NSObject{
   NSInteger vehiculoID;
   NSString *nombreVehiculo;
   NSInteger numeroRuedas;
}
@property (nonatomic, assign) NSInteger vehiculoID;
@property (nonatomic, retain) NSString *nombreVehiculo;
@property (nonatomic, assign) NSInteger numeroRuedas;

@end

Vehiculo.m
#import "Vehiculo.h"

@implementation Vehiculo

@synthesize vehiculoID;
@synthesize nombreVehiculo;
@synthesize numeroRuedas;

@end
 

4.2 Crear el método obtenerRutaBD

A continuación creamos la clase que nos permitirá realizar las operaciones contra la base de datos. Esta clase también la crearemos dentro del grupo modelo. Repetimos la misma operación con la que creamos la clase Vehiculo: Objective-C class, subclase de NSObject y la llamaremos VehiculoDAO. Una vez creada, le añadiremos las propiedades necesarias y definiremos los métodos de obtener datos y obtener la ruta de base de datos, tal y como podemos ver en el siguiente código:

VehiculoDAO.h
#import
@interface VehiculoDAO : NSObject{
sqlite3 *bd;
}
- (NSMutableArray *) obtenerVehiculos;
- (NSString *) obtenerRutaBD;

@end

VehiculoDAO.m
#import "VehiculoDAO.h"
#import "Vehiculo.h"

@implementation VehiculoDAO

- (NSString *) obtenerRutaBD{
    NSString *dirDocs;
    NSArray *rutas;
    NSString *rutaBD;
rutas = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
dirDocs = [rutas objectAtIndex:0];
NSFileManager *fileMgr = [NSFileManager defaultManager];
rutaBD = [[NSString alloc] initWithString:[dirDocs stringByAppendingPathComponent:@"vehiculos.sqlite"]];
if([fileMgr fileExistsAtPath:rutaBD] == NO){
[fileMgr copyItemAtPath:[[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"vehiculos.sqlite"] toPath:rutaBD error:NULL];
}
    return rutaBD;
}
- (NSMutableArray *) obtenerVehiculos{NSMutableArray *listaVehiculos = [[NSMutableArray alloc] init];
NSString *ubicacionDB = [self obtenerRutaBD];if(!(sqlite3_open([ubicacionDB UTF8String], &bd) == SQLITE_OK)){NSLog(@"No se puede conectar con la BD");
}
const char *sentenciaSQL = "SELECT id, nombre_vehiculo, numero_ruedas FROM vehiculo";
sqlite3_stmt *sqlStatement;
if(sqlite3_prepare_v2(bd, sentenciaSQL, -1, &sqlStatement, NULL) != SQLITE_OK){
    NSLog(@"Problema al preparar el statement");
}
while(sqlite3_step(sqlStatement) == SQLITE_ROW){
    Vehiculo *vehiculo = [[Vehiculo alloc] init];vehiculo.vehiculoID = sqlite3_column_int(sqlStatement, 0);
    vehiculo.nombreVehiculo = [NSString stringWithUTF8String:(char *) sqlite3_column_text(sqlStatement, 1)];
    vehiculo.numeroRuedas = sqlite3_column_int(sqlStatement, 2);
    [listaVehiculos addObject:vehiculo];
}
    return listaVehiculos;
}

Hemos creado el método obtenerRutaBD con vistas a la segunda parte de este tutorial, en el que realizaremos inserciones, modificaciones y borrados. El propósito de este método es el de copiar al directorio de Documents del dispositivo el fichero .sqlite siempre y cuando éste no exista. Esto es debido a que no se puede escribir en ficheros que se encuentren en la raíz de la aplicación (main bundle) ya que es de sólo lectura. Por otro lado, en el método obtenerVehiculos podemos ver cómo se obtiene la ruta de nuestro fichero de base de datos, se abre la conexión, se prepara la sentencia y se lanza. Todo esto puede hacerse gracias a los métodos sqlite3_open, sqlite3_prepare_v2 y sqlite3_step.

Paso 5: creación de Storyboard

Ahora crearemos nuestro storyboard para poder gestionar todas estas operaciones. Primero de todo, añadiremos a nuestro storyboard un TableViewController. Una vez añadido, seleccionamos el controller y una vez hecho esto, abrimos el menú Editor y seleccionamos la opción Embed In -> Navigation Controller. También añadiremos un ViewController al storyboard, y a este nuevo ViewController le añadimos dos UILabel y dos UITextField y le ponemos como identificador el nombre visualización, quedando finalmente nuestro storyboard tal y como muestra la siguiente imagen:

Vista del Storyboard

También seleccionamos la celda del TableViewController y le ponemos como identificador el nombre celda.

Paso 6: mostrar datos en TableViewController

Ahora vamos a centrarnos en mostrar datos en el TableViewController. Lo primero que haremos será crear una nueva clase que sea una subclase de UITableViewController, la llamaremosListaVehiculosViewController y en nuestro storyboard se la asignaremos al TableViewController. En esta nueva clase definiremos un objeto de tipo VehiculoDAO y otro de tipo NSMutableArray. En el método viewDidLoad inicializaremos estos dos objetos y, una vez inicializados, lanzaremos una consulta para que nos devuelva todos los vehículos de nuestra tabla con este código:

ListaVehiculosViewController.h
#import
#import "VehiculoDAO.h"
@interface ListaVehiculosViewController : UITableViewController{
    VehiculoDAO *dao;NSMutableArray *vehiculos;
}

@property (nonatomic, strong) VehiculoDAO *dao;
@property (nonatomic, strong) NSMutableArray *vehiculos;

@end

ListaVehiculosViewController.m@synthesize dao;
@synthesize vehiculos;
- (void)viewDidLoad{
    dao = [[VehiculoDAO alloc] init];
    vehiculos = [[NSMutableArray alloc] init];
    vehiculos = [dao obtenerVehiculos];
    [super viewDidLoad];
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
    return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return [vehiculos count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    static NSString *CellIdentifier = @"celda";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    cell.textLabel.text = [[vehiculos objectAtIndex:[indexPath row]] valueForKey:@"nombreVehiculo"];
    return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    ModVehiculoViewController *destino = [self.storyboard instantiateViewControllerWithIdentifier:@"visualizacion"];
    Vehiculo *tmp = [vehiculos objectAtIndex:[indexPath row]];
    destino.vehiculo = tmp;
    [self.navigationController pushViewController:destino animated:YES];
}

Como podemos ver en el código, le indicaremos que sólo tendrá una sección y el número de filas será el tamaño del array que nos devuelva la consulta. También hemos implementado el método didSelectRowAtIndexPath para hacer la transición desde la celda hasta el ViewController que nos enseñará los datos del vehículo.

Paso 7: modificaciones y resultado

Por último, nos centraremos en el ViewController de destino. Para ello, vamos a aprovecharnos de la clase ViewController que se crea por defecto cuando creamos el proyecto. Primero de todo, la renombramos a ModVehiculoViewController y se la asignamos en el storyboard al ViewController. Una vez hecho esto, en la clase definiremos los IBOutlet necesarios, un objeto de tipo VehiculoDAO y otro objeto de tipo Vehiculo. Por último, definiremos también un método para ocultar el teclado. La clase quedará como puede verse en el siguiente código:

ModVehiculoViewController.h

#import
#import "VehiculoDAO.h"
#import "Vehiculo.h"
@interface ModVehiculoViewController : UIViewController{
    IBOutlet UILabel *etqNombre;IBOutlet UILabel *etqRuedas;IBOutlet UITextField *txtNombre;IBOutlet UITextField *txtRuedas;VehiculoDAO *dao;Vehiculo *vehiculo;
}

@property (nonatomic, strong) IBOutlet UILabel *etqNombre;
@property (nonatomic, strong) IBOutlet UILabel *etqRuedas;
@property (nonatomic, strong) IBOutlet UITextField *txtNombre;
@property (nonatomic, strong) IBOutlet UITextField *txtRuedas;
@property (nonatomic, strong) Vehiculo *vehiculo;
@property (nonatomic, strong) VehiculoDAO *dao;

- (IBAction) ocultarTeclado:(id)sender;

@end

ModVehiculoViewController.m
@synthesize etqNombre;
@synthesize etqRuedas;
@synthesize txtNombre;
@synthesize txtRuedas;
@synthesize dao;
@synthesize vehiculo;
-(void) touchesBegan :(NSSet *) touches withEvent:(UIEvent *)event{
    [txtNombre resignFirstResponder];
    [txtRuedas resignFirstResponder];
    [super touchesBegan:touches withEvent:event ];
}
- (IBAction)ocultarTeclado:(id)sender{}
- (void)viewDidLoad{
    [txtNombre setText:vehiculo.nombreVehiculo];
    [txtRuedas setText:[NSString stringWithFormat:@"%d", vehiculo.numeroRuedas]];
    [txtRuedas setKeyboardType:UIKeyboardTypeNumberPad];
    dao = [[VehiculoDAO alloc] init];
    [super viewDidLoad];
}

Y con esto ya tenemos la primera parte de nuestro tutorial terminada. Bastará con ejecutar el simulador para ver el resultado:

Vista de la aplicación en el emulador

Parte 2 del tutorial

Puedes continuar con la segunda parte del tutorial haciendo click aquí.

iOS 16
iconAcademy
100% Tutorizado
iconAcademy
Hasta 100% bonificable
iOS es el sistema operativo utilizado por Apple, y en el que se basan todas sus aplicaciones. Aprende en este curso el funcionamiento del lenguaje Swift para la creación de aplicaciones de iOS.
¡Me interesa!
iconClienticonClienticonClienticonClienticonClienticonClienticonClienticonClienticonClienticonClienticonClienticonClienticonClienticonClienticonClienticonClienticonClienticonClienticonClienticonClienticonClienticonClient