Datos persistentes en IOS Luis Montesano & Ana Cristina Murillo
Tres opciones Archivos SQLite Core Data
SQLite SQL: Structured Query Language No en detalle. Solo vamos a ver como integrarlo en IOS y en una aplicación MacOS incorpora una pre-instalación de SQLite sqlite3./mydatbase.db SQLite version 3.6.12 Enter ".help" for instructions Enter SQL statements terminated with a ";" sqlite>
Conocimientos mínimos de SQL Los datos se organizan en tablas Crear una tabla: create table contacts (id integer primary key autoincrement, name text, address text, phone text); Ver tablas: sqlite>.tables contacts Insertar registros en las tablas: sqlite> insert into contacts (name, address, phone) values ("Bill Smith", "123 main Street, California", "123-555-2323"); sqlite> insert into contacts (name, address, phone) values ("Mike Parks", "10 Upping Street, Idaho", "444-444-1212");
Conocimientos mínimos de SQL II Recuperar registros de una tabla sqlite> select * from contacts; 1 Bill Smith 123 main Street, California 123-555-2323 2 Mike Parks 10 Upping Street, Idaho 444-444-1212 Recuperar registros que cumplen con un criterio: sqlite> select * from contacts where name="mike Parks"; 2 Mike Parks 10 Upping Street, Idaho 444-444-1212 To exit from the sqlite3 interactive environment: sqlite>.exit
Simulador IOS Las bases de datos que cree el telefono se guardan en el ordenador /Users/<user>/Library/Application Support/iPhone Simulator/ <sdk version>/applications/<id>/documents Permite depurar y consultar desde fuera del navegador
SQLite en IOS Es necesario añadir la librería dinámica libsqlite3.dylib Añadir en Existing frameworks Incluir el import correspondiente #import "/usr/include/sqlite3.h" La libreria contiene funciones en C, que son facilmente llamadas desde Objective C Algunas conversiones entre cadenas
Funciones de SQLite sqlite3_open() - Opens specified database file. If the database file does not already exist, it is created. sqlite3_close() - Closes a previously opened database file. sqlite3_prepare_v2() - Prepares a SQL statement ready for execution. sqlite3_step() - Executes a SQL statement previously prepared by the sqlite3_prepare_v2() function. sqlite3_column_<type>() - Returns a data field from La lista completa esta en: http://www.sqlite.org/c3ref/funclist.html.
Pasos básicos Declarar una based de datos Abrir o crear una base de datos Preparar y ejecutar una sentencia SQL Crear una tabla Extraer información de una tabla Cerrar una base de datos
Declarar una base de datos Paso necesario para cualquier tarea sobre una base de datos int sqlite3_open(const char *filename, sqlite3 **database); Podeis ver la estructura sqlite3 en sqlite3.h
Apertura Apertura int sqlite3_open(const char *filename, sqlite3 **database); Ejemplo con NSString: sqlite3 *contactdb; //Declare a pointer to sqlite database structure const char *dbpath = [databasepath UTF8String]; // Convert NSString to UTF-8 if (sqlite3_open(dbpath, &contactdb) == SQLITE_OK) { //Database opened successfully } else { //Failed to open database }
Preparación: Ejecutar sentencia SQL sqlite3_stmt *statement; NSString *querysql = @"SELECT address, phone FROM contacts ; const char *query_stmt = [querysql UTF8String]; if (sqlite3_prepare_v2(contactdb, query_stmt, -1, &statement, NULL) == SQLITE_OK) { //Statement prepared successfully } else { //Statement preparation failed } Uso de la sentencia: sqlite3_step(statement); sqlite3_finalize(statement);
Creación de una tabla const char *sql_stmt = "CREATE TABLE IF NOT EXISTS CONTACTS (ID INTEGER PRIMARY KEY AUTOINCREMENT, NAME TEXT, ADDRESS TEXT, PHONE TEXT)"; if (sqlite3_exec(contactdb, sql_stmt, NULL, NULL, &errmsg) == SQLITE_OK) { // SQL statement execution succeeded }
Consulta de una tabla SQL usa la sentencia SELECT Puede haber multiples respuestas Dos pasos: Preparación sqlite3_stmt *statement; NSString *querysql = @"SELECT address, phone FROM contacts ; const char *query_stmt = [querysql UTF8String]; sqlite3_prepare_v2(contactdb, query_stmt, -1, &statement, NULL);
Consulta de una tabla Dos pasos: Ejecución while (sqlite3_step(statement) == SQLITE_ROW) { NSString *addressfield = [[NSString alloc] initwithutf8string: (const char *) sqlite3_column_text(statement, 0)]; NSString *phonefield = [[NSString alloc] initwithutf8string: (const char *) sqlite3_column_text(statement, 1)]; // Code to do something with extracted data here [phonefield release]; [addressfield release]; } sqlite3_finalize(statement);
Cerrar la base de datos Al terminar se debe cerrar la base de datos sqlite3_close(contactdb);