En el desarrollo de aplicaciones para el iPhone constantemente nos encontramos con la necesidad de guardar información y disponer de ella más adelante. Para dar solución a esto podemos implementar SQLite un pequeño, rápido y confiable sistema de gestión de bases de datos que está disponible para el iPhone.

Características de SQLite

  • Es un motor de base de datos SQL embebido. SQLite no tiene un proceso de servidor independiente.
  • Lee y escribe directamente en archivos de disco normal. Una completa base de datos con tablas, índices y vistas, está contenida en un archivo de disco único.
  • Formato de archivo de base de datos multi-plataforma (32-bits y 64-bits)
  • No considerar SQLite como un reemplazo para Oracle, sino como un sustituto de fopen ()

Implementando SQLite en una aplicación

Para administrar los archivos creados que serán utilizados por nuestra aplicación podemos descargar SQLite Database Browser una aplicación gratuita que nos brinda una interfaz gráfica para crear, diseñar y editar archivos de base de datos compatibles con SQLite.

Empezaremos creando un proyecto en Xcode de tipo “Ya debes suponer cual, sino, revisa este artículo :)”

1. Crear un archivo de base de datos con las siguiente estructura

2. Agregar el archivo de base de datos creado y la librería “libsqlite3.dylib” a nuestro proyecto

3. Definir un método para la creación del archivo de base de datos en la aplicación

- (void)createEditableCopyOfDatabaseIfNeeded
{
BOOL success;
NSFileManager *fileManager = [NSFileManager defaultManager];
NSError *error;
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"myDB"];
success = [fileManager fileExistsAtPath:writableDBPath];

// Si ya existe el archivo, no lo crea -_-
if (success) return;

// Crea el archivo en el dispositivo
NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"myDB"];
success = [fileManager copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error];
if (!success)
NSAssert1(0, @"Failed to create writable database file with message '%@'.", [error localizedDescription]);

}

4. Definir el método para realizar las consultas en la base de datos

-(void)executeSentence:(NSString *)sentence sentenceIsSelect:(BOOL )isSelect{

// Variables para realizar la consulta
static sqlite3 *db;
sqlite3_stmt *resultado;
const char* siguiente;

// Buscar el archivo de base de datos
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"myDB"];

// Abre el archivo de base de datos
if (sqlite3_open([path UTF8String], &db) == SQLITE_OK) {

if (isSelect){

// Ejecuta la consulta
if ( sqlite3_prepare(db,[sentence UTF8String],[sentence length],&resultado,&siguiente) == SQLITE_OK ){

// Recorre el resultado
while (sqlite3_step(resultado)==SQLITE_ROW){
NSLog([NSString stringWithFormat:@"ID:%@ NAME:%@ INFO:%@",
[NSString stringWithUTF8String: (char *)sqlite3_column_text(resultado, 0)],
[NSString stringWithUTF8String: (char *)sqlite3_column_text(resultado, 1)],
[NSString stringWithUTF8String: (char *)sqlite3_column_text(resultado, 2)] ]
);
}
}
}
else {
// Ejecuta la consulta
if ( sqlite3_prepare_v2(db,[sentence UTF8String],[sentence length],&resultado,&siguiente) == SQLITE_OK ){
sqlite3_step(resultado);
sqlite3_finalize(resultado);
}
}
}
// Cierra el archivo de base de datos
sqlite3_close(db);
}

5. Definir las consultas a realizar

- (void)viewDidLoad
{
[super viewDidLoad];

[self createEditableCopyOfDatabaseIfNeeded];

NSString *sentencetDB = @"insert into userTable values ( NULL, 'Javier', 'Programador' )";
[self executeSentence:sentencetDB sentenceIsSelect:NO];

sentencetDB = @"select * from userTable";
[self executeSentence:sentencetDB sentenceIsSelect:YES];

}

6. Compilar y Ejecutar

Si todo ha salido bien, en la consola se podrán observar los resultados de la consulta realizada. En caso contrario, puedes descargar el código del proyecto en Xcode para realizar el genial procedimiento de “Build and Run” :)

Repositorio en GitHub : MDW-GuiaiOS06-SQLite