Guía iOS: Gestión de bds con SQLite
Actualizado : 21 octubre 2011 (iOS 5)
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
Como siempre, geniales los tutos.
Ya que explicaste lo referente a SQLite, searia posible y si hay tiempo, ver el uso de SQLcipher? q te permite encriptar los datos de la base de datos. Creo que la mayoria de los developers que integren SQLite en su app estarian bastante interesados, y de paso, ya q no hay un solo tuto en español (ni claro), atraerias bastante mas devs. No es muy complicado, pero todavia hay cosas que se me escapan y toy 98% seguro de que no lo integre bien.
Si se puede, desde ya muchas gracias.
Saludos
[…] Guía iPhone e iPad Gestión de bds con SQLite […]
Muy bueno el website, me gusta mucho su diseño algún día quisiera tener uno así, hay que tener paciencia
hola buenas noches
me gusto esta parte pero no la comprendo de todo
ya que soy principiante en esto, apesar de que llevo una carrera tecnica universitaria en informatica espero pueda proporcionarme mas informacion pero si no es mucho pedir dede el inicio y asi aprenda mejor
muy buena la data, ahora logre hacer andar esto, quedo bien, pero ahora quiero ver como puedo hacer para modificar los datos de la tabla y agregarle nuevos desde la pantalla del iphone.
desde ya muchas gracias.
saludos.
Gracias!!
Estimado. Gracias por compartir informacion. Ahora, fijate que el ejemplo que diste no esta igual al proyecto para bajar. De hecho cuando ejecutas en el ejemplo te da un error de variable inexistente de & en el metodo Execute, cuando lo ejecutas ese mismo metodo desde el zip, funciona bien porque la variable no existe…
Un abrazo
He leido que comentabas que tocareis el tema de trabajar con el GPS, me ayudaria muchisimo que lo hicieras, ya que estoy planeando una aplicacion la qual haga uso de el, y no encuentro nada.
Espero que lo podais hacer, y sigais con vuestro excelente trabajo