logoImagina
iconCurso
Te recomendamos nuestro curso de iOS 16
Descubre el curso de iOS 16
Ir al curso
Descubre la formación a tu medida
Rellena el formulario para obtener más información sobre los cursos.
Tamaño de la empresa *
Términos y condiciones *

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

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

Crear una aplicación con SQLite en iOS 6

Antes de seguir con este tutorial te recomendamos que consultes la priemera parte de este tutorial ya que partiremos del punto en el que lo dejamos.

Además, si quieres seguir aprendiendo a desarrollar en iOS te recomendamos que consultes la página de nuestro curso de desarrollo en iOS.

Parte 2: Operaciones en la base de datos

En esta segunda parte del tutorial, aprenderemos cómo realizar inserciones, modificaciones y borrados de datos en nuestra base de datos de vehículos. Para ello, completaremos la clase VehiculoDAO añadiendo los métodos necesarios. A continuación se muestra el código fuente que debemos añadir:

VehiculoDAO.h

(void)crearVehiculo:(NSString *)nombre ruedas:(NSInteger)ruedas;
(void)actualizarVehiculo:(NSInteger)vehiculoID nombre:(NSString *)nombre ruedas:(NSInteger)ruedas;
(void)borrarVehiculo:(NSInteger)vehiculoID;

VehiculoDAO.m

(void)crearVehiculo:(NSString *)nombre ruedas:(NSInteger)ruedas {
    NSString *ubicacionDB = [self obtenerRutaBD];
    
    if (!(sqlite3_open([ubicacionDB UTF8String], &bd) == SQLITE_OK)) {
        NSLog(@"No se puede conectar con la BD");
        return;
    } else {
        NSString *sqlInsert = [NSString stringWithFormat:@"INSERT INTO vehiculo (nombre_vehiculo, numero_ruedas) VALUES ('%@', %d)", nombre, ruedas];
        const char *sql = [sqlInsert UTF8String];
        sqlite3_stmt *sqlStatement;
        
        if (sqlite3_prepare_v2(bd, sql, -1, &sqlStatement, NULL) != SQLITE_OK) {
            NSLog(@"Problema al preparar el statement");
            return;
        } else {
            if (sqlite3_step(sqlStatement) == SQLITE_DONE) {
                sqlite3_finalize(sqlStatement);
                sqlite3_close(bd);
            }
        }
    }
}
(void)actualizarVehiculo:(NSInteger)vehiculoID nombre:(NSString *)nombre ruedas:(NSInteger)ruedas {
    NSString *ubicacionBD = [self obtenerRutaBD];
    
    if (!(sqlite3_open([ubicacionBD UTF8String], &bd) == SQLITE_OK)) {
        NSLog(@"No se puede conectar con la BD");
        return;
    } else {
        NSString *sqlUpdate = [NSString stringWithFormat:@"UPDATE vehiculo SET nombre_vehiculo = '%@', numero_ruedas = %d WHERE id = %d", nombre, ruedas, vehiculoID];
        const char *sql = [sqlUpdate UTF8String];
        sqlite3_stmt *sqlStatement;
        
        if (sqlite3_prepare_v2(bd, sql, -1, &sqlStatement, NULL) != SQLITE_OK) {
            NSLog(@"Problema al preparar el statement.");
            return;
        } else {
            if (sqlite3_step(sqlStatement) == SQLITE_DONE) {
                sqlite3_finalize(sqlStatement);
                sqlite3_close(bd);
            }
        }
    }
}
(void)borrarVehiculo:(NSInteger)vehiculoID {
    NSString *ubicacionBD = [self obtenerRutaBD];
    
    if (!(sqlite3_open([ubicacionBD UTF8String], &bd) == SQLITE_OK)) {
        NSLog(@"No se puede conectar con la BD");
        return;
    } else {
        NSString *sqlDelete = [NSString stringWithFormat:@"DELETE FROM vehiculo WHERE id = %d", vehiculoID];
        const char *sql = [sqlDelete UTF8String];
        sqlite3_stmt *sqlStatement;
        
        if (sqlite3_prepare_v

2(bd, sql, -1, &sqlStatement, NULL) != SQLITE_OK) {
            NSLog(@"Problema al preparar el statement.");
            return;
        } else {
            if (sqlite3_step(sqlStatement) == SQLITE_DONE) {
                sqlite3_finalize(sqlStatement);
                sqlite3_close(bd);
            }
        }
    }
}

Estos métodos siguen una estructura similar al método de consulta, lo único que cambia es la sentencia SQL que se ejecuta y el procesamiento final.

Descubre la formación a tu medida
Rellena el formulario para obtener más información sobre los cursos.
Tamaño de la empresa *
Términos y condiciones *

Configuración de la interfaz de usuario

Ahora nos dirigiremos al storyboard y añadiremos un nuevo ViewController. A este ViewController le añadiremos dos etiquetas (UILabel), dos campos de texto (UITextField) y un botón (UIButton).

A continuación, crearemos una nueva clase en nuestro proyecto llamada AltaVehiculoViewController y la asociaremos en el storyboard a este nuevo ViewController. Una vez renombrada la clase, definiremos los IBOutlet necesarios y el IBAction correspondiente para el alta de un nuevo elemento. También crearemos un objeto de tipo VehiculoDAO, que nos permitirá conectarnos a la base de datos y ejecutar las operaciones necesarias. En el método viewDidLoad, inicializaremos el objeto dao y estará listo para su uso. Ahora solo queda programar el proceso de alta, para ello utilizaremos el siguiente código:

AltaVehiculoViewController.h

#import <UIKit/UIKit.h>
#import "VehiculoDAO.h"

@interface AltaVehiculoViewController : UIViewController

@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) IBOutlet UIButton *btnCrear;
@property (nonatomic, strong) VehiculoDAO *dao;

- (IBAction)ocultarTeclado:(id)sender;
- (IBAction)crearNuevoVehiculo:(id)sender;

@end

AltaVehiculoViewController.m

#import "AltaVehiculoViewController.h"

@implementation AltaVehiculoViewController

@synthesize etqNombre;
@synthesize etqRuedas;
@synthesize txtNombre;
@synthesize txtRuedas;
@synthesize btnCrear;
@synthesize dao;

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [txtNombre resignFirstResponder];
    [txtRuedas resignFirstResponder];
    [super touchesBegan:touches withEvent:event];
}

- (void)viewDidLoad {
    dao = [[VehiculoDAO alloc] init];
    [txtRuedas setKeyboardType:UIKeyboardTypeNumberPad];
    [super viewDidLoad];
}

- (IBAction)ocultarTeclado:(id)sender {
    // Acción para ocultar el teclado
}

- (IBAction)crearNuevoVehiculo:(id)sender {
    NSString *nombre = [NSString stringWithFormat:@"%@", txtNombre.text];
    NSInteger ruedas = [txtRuedas.text integerValue];
    
    [dao crearVehiculo:nombre ruedas:ruedas];
}

@end

Realiza las conexiones correspondientes en el storyboard, asegurándote de asociar todos los métodos (incluyendo el de ocultar el teclado). Con esto, la clase estará lista.

Volvemos al storyboard y en el TableViewController añadire

mos un botón tipo Bar Button Item en la barra de navegación. Luego, uniremos este botón con el ViewController que acabamos de añadir mediante un segue de tipo Push. Para ello, seleccionamos el botón y, manteniendo presionada la tecla Control, arrastramos el ratón hacia el controlador de destino. En el menú desplegable que aparece, seleccionamos Push y así quedará vinculado el TableViewController con el ViewController de altas.

Ahora nos dirigimos al ViewController que utilizamos en la primera parte como detalle de datos y le añadimos dos botones (UIButton), uno para modificar y otro para borrar. También editaremos la clase ModVehiculoViewController para agregar estos dos botones y los dos nuevos métodos, uno para borrar y otro para modificar un vehículo. El siguiente código muestra las modificaciones necesarias:

ModVehiculoViewController.h

@interface ModVehiculoViewController : UIViewController

@property (nonatomic, strong) IBOutlet UIButton *btnModificar;
@property (nonatomic, strong) IBOutlet UIButton *btnBorrar;

- (IBAction)modificarVehiculo:(id)sender;
- (IBAction)borrarVehiculo:(id)sender;

@end

ModVehiculoViewController.m

@implementation ModVehiculoViewController

@synthesize btnModificar;
@synthesize btnBorrar;

- (IBAction)modificarVehiculo:(id)sender {
    NSInteger vehiculoID = vehiculo.vehiculoID;
    NSString *nombre = txtNombre.text;
    NSInteger numRuedas = [txtRuedas.text integerValue];

    [dao actualizarVehiculo:vehiculoID nombre:nombre ruedas:numRuedas];
}

- (IBAction)borrarVehiculo:(id)sender {
    NSInteger vehiculoID = vehiculo.vehiculoID;

    [dao borrarVehiculo:vehiculoID];
}

@end

Realiza las conexiones correspondientes en el storyboard, incluyendo los actions que se lanzarán al presionar cada botón. Con esto, el ViewController estará listo para modificar y borrar datos.

Mejoras adicionales

Una vez realizadas todas estas acciones, tendrás una aplicación lista para realizar altas, bajas, modificaciones y consultas en una base de datos SQLite. Para brindar más información, puedes agregar una alerta después de cada operación que implique cambios en la base de datos.

Aprender a desarrollar aplicaciones iOS

En conclusión, en este tutorial hemos aprendido cómo utilizar SQLite en una aplicación iOS para realizar operaciones básicas de creación, lectura, actualización y eliminación de datos. Hemos visto cómo configurar la base de datos, crear una clase DAO para interactuar con ella y cómo implementar las funcionalidades de consulta, alta, modificación y borrado en nuestras vistas.

Además, hemos explorado la navegación entre vistas y cómo utilizar segues para pasar datos entre ellas. También hemos agregado mejoras adicionales, como la validación de datos y la presentación de alertas para brindar retroalimentación al usuario.

Si deseas profundizar en el desarrollo de aplicaciones iOS, te invitamos a consultar nuestro curso de desarrollo en iOS en nuestra página web. Allí encontrarás recursos y tutoriales adicionales para ampliar tus conocimientos y seguir avanzando en el emocionante mundo del desarrollo de aplicaciones móviles.

¡Esperamos que este tutorial haya sido útil y te inspire a seguir explorando y desarrollando tus habilidades en iOS!

Descubre la formación a tu medida
Rellena el formulario para obtener más información sobre los cursos.
Tamaño de la empresa *
Términos y condiciones *
iconClienticonClienticonClienticonClienticonClienticonClienticonClienticonClienticonClienticonClienticonClienticonClienticonClienticonClienticonClienticonClienticonClienticonClienticonClienticonClienticonClienticonClient