SQLiteBooks, metodos hydrate y dehydrate

Share

En este post vamos a desglosar y analizar los metodos hydrate y dehydrate del ejemplo SQLiteBooks que talvez muchos no tenemos muy claro como funciona:
Estos métodos sirven para cargar y descargar nuestros datos de la memoria. Empecemos con hydrate:

En el ejemplo, tenemos un metodo llamado initWithPrimaryKey: que recupera el nombre del libro, con hydrate nos aseguramos de traer el resto de los datos a nuestro objeto.

Los argumentos que se pasan a sqlite3_prepare_v2 son: el nombre de la base de datos, la consulta, la longitud de la consulta en bytes, la consulta compilada y el puntero a una porción no usada de la consulta (en el ejemplo NULL).

C++:
  1. (void)hydrate {
  2.     // Verificamos si es necesario cargar los datos, si ya estan en memoria no se realiza ninguna acción.
  3.     if (hydrated) return;
  4.    
  5.     //Para que se ejecute una consulta es necesario compilarla previamente, para esto se emplea sqlite3_prepare_v2
  6.  
  7.     if (hydrate_statement == nil) {
  8.         const char *sql = "SELECT author, copyright FROM book WHERE pk=?";
  9.         if (sqlite3_prepare_v2(database, sql, -1, &hydrate_statement, NULL) != SQLITE_OK) {
  10.             NSAssert1(0, @"Error: failed to prepare statement with message '%s'.", sqlite3_errmsg(database));
  11.         }
  12.     }
  13.  
  14.     // Enlazamos  el parametro "primaryKey" a la consulta
  15.     sqlite3_bind_int(hydrate_statement, 1, primaryKey);
  16.  
  17.     // Ejecutamos la consulta que nos devuelve SQLITE_ROW
  18.     int success =sqlite3_step(hydrate_statement);
  19.     if (success == SQLITE_ROW) {
  20.         char *str = (char *)sqlite3_column_text(hydrate_statement, 0);
  21.         self.author = (str) ? [NSString stringWithUTF8String:str] : @"";
  22.         self.copyright = [NSDate dateWithTimeIntervalSince1970:sqlite3_column_double(hydrate_statement, 1)];
  23.     } else {
  24.         // Si la consulta no generó resultados
  25.         self.author = @"Unknown";
  26.         self.copyright = [NSDate date];
  27.     }
  28.     // Reseteamos la consulta para un proximo uso
  29.     sqlite3_reset(hydrate_statement);
  30.     // Actualizamos el estado del objeto a hydrated
  31.     hydrated = YES;
  32. }

El metodo dehydrate descarga de la memoria todos los datos excepto la llave primaria y nos permite realizar cualquier cambio en los datos:

C++:
  1. - (void)dehydrate {
  2.     if (dirty) {
  3.         ////Para que se ejecute una consulta es necesario compilarla previamente, para esto se emplea sqlite3_prepare_v2
  4.         if (dehydrate_statement == nil) {
  5.             const char *sql = "UPDATE book SET title=?, author=?, copyright=? WHERE pk=?";
  6.             if (sqlite3_prepare_v2(database, sql, -1, &dehydrate_statement, NULL) != SQLITE_OK) {
  7.                 NSAssert1(0, @"Error: failed to prepare statement with message '%s'.", sqlite3_errmsg(database));
  8.             }
  9.         }
  10.         // Enlazamos las variables de la consulta
  11.         sqlite3_bind_text(dehydrate_statement, 1, [title UTF8String], -1, SQLITE_TRANSIENT);
  12.         sqlite3_bind_text(dehydrate_statement, 2, [author UTF8String], -1, SQLITE_TRANSIENT);
  13.         sqlite3_bind_double(dehydrate_statement, 3, [copyright timeIntervalSince1970]);
  14.         sqlite3_bind_int(dehydrate_statement, 4, primaryKey);
  15.         // Ejecutamos la consulta
  16.         int success = sqlite3_step(dehydrate_statement);
  17.         // Reseteamos la consulta para un proximo uso
  18.         sqlite3_reset(dehydrate_statement);
  19.         // Manejamos los errores
  20.         if (success != SQLITE_DONE) {
  21.             NSAssert1(0, @"Error: failed to dehydrate with message '%s'.", sqlite3_errmsg(database));
  22.         }
  23.         // Actualizamos el estado del objeto respecto a los cambios
  24.         dirty = NO;
  25.     }
  26.    
  27.    //Finalmente liberamos nuestras variables de la memoria
  28.     [author release];
  29.     author = nil;
  30.     [copyright release];
  31.     copyright = nil;
  32.     [data release];
  33.     data = nil;
  34.     // Actualizamos el estado del objeto a hydrated = NO
  35.     hydrated = NO;
  36. }

Espero que el post haya servido para aclarar algunas dudas y bueno cualquier comentario o pregunta son bienvenidos.

banner ad

Leave a Reply