OS y SQLite hacen una combinación poderosa para la construcción de datos persistente iPad, iPhone o aplicaciones móviles iPod Touch. El SDK de iOS ofrece soporte nativo para SQLite a través del uso del lenguaje de programación C. Este tutorial te guiará a través de cómo configurar una aplicación de base de datos SQLite y para leer el texto y las imágenes de la base de datos en una escena.
Crear IOS 5 Proyecto
Configure SQLite
Crear un nuevo grupo (Archivo | Nuevo grupo) o del (Context Menu | Nuevo grupo). El nombre de "Modelo". A continuación, cree dos archivos de aplicación de Objective-C y ficheros de cabecera correspondientes. Seleccione el grupo modelo y en el menú Archivo o en el menú contextual | seleccionar Nuevo archivo.Seleccione el nodo de Objective-C y después la plantilla de clase Objective-C. Dé su archivo un nombre: carta de vinos (si usted está siguiendo este tutorial), seleccione NSObject como la subclase y crear el archivo. Repita el proceso para el siguiente conjunto de archivos: MyWineList, (o puede elegir un nombre como WinesDAO). Seleccione de nuevo el NSObject como la subclase y crear el archivo (Figura 9). Para la clase winelist crear cuatro propiedades en el archivo WineList.h (cabecera), uno para cada columna de la wineTbl (Figura 10):
A continuación abra el archivo WineList.m (aplicación) para configurar los métodos getter y setter. Así que su carta de vinos debe contener cuatro @ sintetizar declaraciones, uno de cuatro de cada propiedad (Figura 11).
NSMutableArray * wineArray = [[NSMutableArray alloc] init];
@ try {
NSFileManager * filemgr = [NSFileManager defaultManager];
NSString * dbPath = [[[NSBundle mainBundle] ResourcePath] stringByAppendingPathComponent: @ "IOSDB.sqlite"];
éxito BOOL = [filemgr fileExistsAtPath: dbPath];
...
El dbPath contendrá el nombre del archivo y la ruta de la base de datos SQLite, que se pasa a la filemgr. Si el archivo se encuentra, el éxito será cierto. Siguiente prueba para ver si el archivo se encuentra y si no se registrará un error. La siguiente operación intentará abrir la base de datos, sqlite3_open antes de configurar la instrucción Select y sql3_stmt:
El dbPath contendrá el nombre del archivo y la ruta de la base de datos SQLite, que se pasa a la filemgr. Si el archivo se encuentra, el éxito será cierto. Siguiente prueba para ver si el archivo se encuentra y si no se registrará un error. La siguiente operación intentará abrir la base de datos, sqlite3_open antes de configurar la instrucción Select y sql3_stmt:
if (success!)
{
NSLog (@ "No se puede localizar el archivo de base de datos '% @'.", dbPath);
}
if ((sqlite3_open ([dbPath UTF8String], y db) == SQLITE_OK)!)
{
NSLog (@ "Un error ha ocurrido ");.
}
const char * sql = "SELECT id, Vino, Clasificación, foto De WineTbl";
sqlite3_stmt * SqlStatement;
if (sqlite3_prepare (db, sql, -1, y SqlStatement, NULL) = SQLITE_OK)!
{
NSLog (@ "problema con preparar la declaración");
}
...
Si la base de datos se abre correctamente, la sqlite3_prepare intentará ejecutar el SqlStatement. Si la sentencia se ejecuta con éxito dando lugar a un conjunto de resultados que se devuelve, a continuación, ejecutar un bucle while para recorrer el conjunto de resultados de asignar los valores a los campos NSMutableArray. ...while (sqlite3_step (SqlStatement) == SQLITE_ROW) { winelist * MyWine = [[alloc winelist] init]; MyWine.wineId = sqlite3_column_int (SqlStatement, 0); MyWine.wine = [NSString stringWithUTF8String: (char *) sqlite3_column_text (SqlStatement, 1)]; MyWine.rating = [NSString stringWithUTF8String: (char * ) sqlite3_column_text (SqlStatement, 2)];const char * cruda = sqlite3_column_blob (SqlStatement, 3); int rawLen = sqlite3_column_bytes (SqlStatement, 3); NSData * = datos [dataWithBytes NSData: longitud cruda: rawLen]; MyWine.photo = [ [UIImage alloc] initWithData: Datos]; [wineArray addObject: MyWine]; } } @ catch (NSException * excepción) { NSLog (@ "Una excepción ocurrió:% @", [motivo excepción]); } @ {finalmente regresar wineArray ; } ... Esto casi se encarga de la de las operaciones CRUD. El siguiente paso consistirá en la creación de la interfaz de usuario, la creación de IBActions y conexiones IBOutlets.(Véase la Figura 12, 13).
Si la base de datos se abre correctamente, la sqlite3_prepare intentará ejecutar el SqlStatement. Si la sentencia se ejecuta con éxito dando lugar a un conjunto de resultados que se devuelve, a continuación, ejecutar un bucle while para recorrer el conjunto de resultados de asignar los valores a los campos NSMutableArray. ...while (sqlite3_step (SqlStatement) == SQLITE_ROW) { winelist * MyWine = [[alloc winelist] init]; MyWine.wineId = sqlite3_column_int (SqlStatement, 0); MyWine.wine = [NSString stringWithUTF8String: (char *) sqlite3_column_text (SqlStatement, 1)]; MyWine.rating = [NSString stringWithUTF8String: (char * ) sqlite3_column_text (SqlStatement, 2)];const char * cruda = sqlite3_column_blob (SqlStatement, 3); int rawLen = sqlite3_column_bytes (SqlStatement, 3); NSData * = datos [dataWithBytes NSData: longitud cruda: rawLen]; MyWine.photo = [ [UIImage alloc] initWithData: Datos]; [wineArray addObject: MyWine]; } } @ catch (NSException * excepción) { NSLog (@ "Una excepción ocurrió:% @", [motivo excepción]); } @ {finalmente regresar wineArray ; } ... Esto casi se encarga de la de las operaciones CRUD. El siguiente paso consistirá en la creación de la interfaz de usuario, la creación de IBActions y conexiones IBOutlets.(Véase la Figura 12, 13).
Crear la interfaz de usuario de Operaciones
[Self.winerating setText: (*) (carta de vinos [self.wines objectAtIndex: 0]). Puntuación];
[Súper viewDidLoad];
}
...
en el viewDidUnload establecer sus propiedades a cero para liberarlos de la memoria ... - (void) viewDidUnload { [self setWineViewer: nil]; [auto setWinename: nil]; [auto setWinerating: nil]; [súper viewDidUnload]; } ...Finalmente aplicar el método GetWineListing, de modo que cuando el usuario hace clic en el botón, el índice se incrementa y recupera los datos en el número de índice seleccionado. ... - (IBAction) GetWineListing: (id) {remitenteestática NSInteger currentIndex = 0; if (+ + currentIndex == [cuentan self.wines]) { currentIndex = 0;
} Else {
winelist * aWine = (carta de vinos *) [self.wines objectAtIndex: currentIndex];
[setText self.winename: aWine.wine];
[self.winerating setText: aWine.rating];
[self.wineViewer setImage: aWine. foto];
}
}
...
[Self.winerating setText: (*) (carta de vinos [self.wines objectAtIndex: 0]). Puntuación];
[Súper viewDidLoad];
}
...
en el viewDidUnload establecer sus propiedades a cero para liberarlos de la memoria ... - (void) viewDidUnload { [self setWineViewer: nil]; [auto setWinename: nil]; [auto setWinerating: nil]; [súper viewDidUnload]; } ...Finalmente aplicar el método GetWineListing, de modo que cuando el usuario hace clic en el botón, el índice se incrementa y recupera los datos en el número de índice seleccionado. ... - (IBAction) GetWineListing: (id) {remitenteestática NSInteger currentIndex = 0; if (+ + currentIndex == [cuentan self.wines]) { currentIndex = 0;
} Else {
winelist * aWine = (carta de vinos *) [self.wines objectAtIndex: currentIndex];
[setText self.winename: aWine.wine];
[self.winerating setText: aWine.rating];
[self.wineViewer setImage: aWine. foto];
}
}
...
[Súper viewDidLoad];
}
...
en el viewDidUnload establecer sus propiedades a cero para liberarlos de la memoria ... - (void) viewDidUnload { [self setWineViewer: nil]; [auto setWinename: nil]; [auto setWinerating: nil]; [súper viewDidUnload]; } ...Finalmente aplicar el método GetWineListing, de modo que cuando el usuario hace clic en el botón, el índice se incrementa y recupera los datos en el número de índice seleccionado. ... - (IBAction) GetWineListing: (id) {remitenteestática NSInteger currentIndex = 0; if (+ + currentIndex == [cuentan self.wines]) { currentIndex = 0;
} Else {
winelist * aWine = (carta de vinos *) [self.wines objectAtIndex: currentIndex];
[setText self.winename: aWine.wine];
[self.winerating setText: aWine.rating];
[self.wineViewer setImage: aWine. foto];
}
}
...
en el viewDidUnload establecer sus propiedades a cero para liberarlos de la memoria ... - (void) viewDidUnload { [self setWineViewer: nil]; [auto setWinename: nil]; [auto setWinerating: nil]; [súper viewDidUnload]; } ...Finalmente aplicar el método GetWineListing, de modo que cuando el usuario hace clic en el botón, el índice se incrementa y recupera los datos en el número de índice seleccionado. ... - (IBAction) GetWineListing: (id) {remitenteestática NSInteger currentIndex = 0; if (+ + currentIndex == [cuentan self.wines]) { currentIndex = 0;
} Else {
winelist * aWine = (carta de vinos *) [self.wines objectAtIndex: currentIndex];
[setText self.winename: aWine.wine];
[self.winerating setText: aWine.rating];
[self.wineViewer setImage: aWine. foto];
}
}
...
} Else {
winelist * aWine = (carta de vinos *) [self.wines objectAtIndex: currentIndex];
[setText self.winename: aWine.wine];
[self.winerating setText: aWine.rating];
[self.wineViewer setImage: aWine. foto];
}
}
...
Código Fuente
WineList.m
---------------------------------------------------
MyWineLists?
/ / / / MyWineLists.h / / MyWineList / / / / Creado por Kevin Languedoc en 11/25/11. / / Copyright (c) 2011 kCodebook. Todos los derechos reservados. / / # Import <Foundation/Foundation.h> # Import <sqlite3.h> @ MyWineLists interfaz: NSObject { sqlite3 * db; } - (NSMutableArray *) getMyWines; @ End |
/ / / / MyWineLists.h / / MyWineList / / / / Creado por Kevin Languedoc en 11/25/11. / / Copyright (c) 2011 kCodebook. Todos los derechos reservados. / / # Import <Foundation/Foundation.h> # Import <sqlite3.h> @ MyWineLists interfaz: NSObject { sqlite3 * db; } - (NSMutableArray *) getMyWines; @ End |
/ / / / WineList.h / / MyWineList / / / / Creado por Kevin Languedoc en 11/25/11. / / Copyright (c) 2011 kCodebook. Todos los derechos reservados. / / # Import <Foundation/Foundation.h> @ Interface carta de vinos: NSObject { NSInteger wineId; NSString * vino; NSString * Evaluación; UIImage * foto; } @ Property (no atómica, retener) NSString * vino; @ Property (no atómica, asignar) NSInteger wineId; @ Property (no atómica, retener) NSString * Evaluación; @ Property (no atómica, retener) UIImage * foto; @ End |
/ / / / MyWineLists.m / / MyWineList / / / / Creado por Kevin Languedoc en 11/25/11. / / Copyright (c) 2011 kCodebook. Todos los derechos reservados. / / # Import "MyWineLists.h" # Import "WineList.h" @ MyWineLists implementación - (NSMutableArray *) getMyWines { NSMutableArray * wineArray = [[NSMutableArray alloc] init]; @ probar { NSFileManager * filemgr = [NSFileManager defaultManager]; NSString * dbPath = [[[NSBundle mainBundle] ResourcePath] stringByAppendingPathComponent: @ "IOSDB.sqlite" ]; BOOL success = [filemgr fileExistsAtPath: dbPath]; si (! éxito) { NSLog (@ "No se puede localizar el archivo de base de datos '% @'." , dbPath); } si (! (sqlite3_open ([dbPath UTF8String], y db) == SQLITE_OK)) { NSLog (@ "Ha ocurrido un error." ); } const caracteres * sql = "SELECT id, Vino, Clasificación, foto De WineTbl" ; sqlite3_stmt * SqlStatement; si (sqlite3_prepare (db, sql, -1, y SqlStatement, NULL)! = SQLITE_OK) { NSLog (@ "problema con preparar la declaración" ); } / / mientras que (sqlite3_step (SqlStatement) == SQLITE_ROW) { Carta de vinos * MyWine = [[alloc winelist] init]; MyWine.wineId = sqlite3_column_int (SqlStatement, 0); MyWine.wine = [NSString stringWithUTF8String: ( Char *) sqlite3_column_text (SqlStatement, 1)]; MyWine.rating = [NSString stringWithUTF8String: ( Char *) sqlite3_column_text (SqlStatement, 2)]; const caracteres * cruda = sqlite3_column_blob (SqlStatement, 3); int rawLen = sqlite3_column_bytes (SqlStatement, 3); NSData * = datos [dataWithBytes NSData: longitud cruda: rawLen]; MyWine.photo = [[UIImage alloc] initWithData: Datos]; [WineArray addObject: MyWine]; } } @ capturas (NSException * excepción) { NSLog (@ "Una excepción ocurrió:% @" , [motivo excepción]); } @ Finally { volver wineArray; } } @ End |
/ / / / KcbViewController.h / / MyWineList / / / / Creado por Kevin Languedoc en 11/25/11. / / Copyright (c) 2011 kCodebook. Todos los derechos reservados. / / # Import <UIKit/UIKit.h> @ Interface kcbViewController: UIViewController { NSMutableArray * vinos; } @ Propiedades (no atómica, retener) NSMutableArray * vinos; @ Property (débil, no atómica) IBOutlet UIImageView * wineViewer; @ Property (débil, no atómica) IBOutlet UILabel * winename; @ Property (débil, no atómica) IBOutlet UILabel * winerating; - (IBAction) GetWineListing: (id) del remitente; @ End |
/ / / / KcbViewController.m / / MyWineList / / / / Creado por Kevin Languedoc en 11/25/11. / / Copyright (c) 2011 kCodebook. Todos los derechos reservados. / / # Import "kcbViewController.h" # Import "WineList.h" # Import "MyWineLists.h" @ KcbViewController aplicación @ Sintetizar wineViewer; @ Sintetizar winename; Sintetizar @ winerating, @ Sintetizar los vinos; - ( void ) didReceiveMemoryWarning { [Súper didReceiveMemoryWarning]; / / Liberar todos los datos, imágenes en caché, etc, que no están en uso. } # Pragma mark - Vista del ciclo de vida - ( void ) viewDidLoad { MyWineLists * mywines = [[MyWineLists alloc] init]; self.wines = [mywines getMyWines]; [. Self.wineViewer setImage: ((carta de vinos *) [self.wines objectAtIndex: 0]) photo]; [SetText self.winename: ((carta de vinos *) [self.wines objectAtIndex: 0]). Vino]; [Self.winerating setText: (*) (carta de vinos [self.wines objectAtIndex: 0]). Puntuación]; [Súper viewDidLoad]; } - ( void ) viewDidUnload { [Auto setWineViewer: nil]; [Auto setWinename: nil]; [Auto setWinerating: nil]; [Súper viewDidUnload]; } - (IBAction) GetWineListing: (id) {remitente estática NSInteger currentIndex = 0; si (+ + currentIndex == [cuentan self.wines]) { currentIndex = 0; } más { Carta de vinos * aWine = (carta de vinos *) [self.wines objectAtIndex: currentIndex]; [SetText self.winename: aWine.wine]; [SetText self.winerating: aWine.rating]; [Self.wineViewer setImage: aWine.photo]; } } - ( void ) viewWillAppear: ( BOOL ) animada { [Súper viewWillAppear: animado]; } - ( void ) viewDidAppear: ( BOOL ) animada { [Súper viewDidAppear: animado]; } - ( void ) viewWillDisappear: ( BOOL ) animada { [Súper viewWillDisappear: animado]; } - ( void ) viewDidDisappear: ( BOOL ) animada { [Súper viewDidDisappear: animado]; } - ( BOOL ) shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation) interfaceOrientation { / / SÍ La vuelta de orientaciones compatibles volver (interfaceOrientation = UIInterfaceOrientationPortraitUpsideDown!); } @ End |
Para empezar, tendrá que FireFox de Mozilla
y el plugin Database Manager SQLite. Si
no los tiene, se pueden descargar e instalar desde el sitio web FireFox. Una vez que Firefox se ha instalado,
instale el Administrador de SQLite desde el Administrador de complementos. El SQLite Manager se puede iniciar
desde el menú Firefox o el menú Herramientas, dependiendo de la versión que
está utilizando (ver figura 1).
Haga clic en el nuevo botón de bases de datos (figura 2) para crear una
nueva base de datos. Usted puede
dar cualquier nombre significativo que desea. Tenga
en cuenta, la extensión SQLite se añadirá automáticamente. Se le pide que guarde el archivo en el
sistema de archivos, (naturalmente). Tome
nota de dónde va a guardar, porque usted va a copiar el archivo más adelante en
su proyecto. A continuación, haga
clic en el nuevo botón de la tabla (figura 3) para crear una nueva tabla, una
vez más voy a dejar a usted para nombrar algo útil. Para este tutorial, mi nombré la tabla
wineTbl y he creado cuatro columnas: id [primario, AutoInc, enteros], winename
[varchar], winerating [varchar] y wineimage [burbuja].
Crear una tabla
Crear las columnas necesarias
Por el bien de este
tutorial, voy a rellenar previamente la base de datos con algunas entradas de
vino y las imágenes de la web. Puede agregar datos seleccionando la tabla
y seleccionando la pestaña de navegación y de datos.Para subir una imagen, haga
clic en el icono de clip al lado del campo blob.(Figura 4 y en la figura 5). Ahora
puede cerrar la base de datos desde el menú Firefox y Firefox, así, ya que no
necesitaremos más para el tutorial.
Agregar un nuevo registro en la base de datos
Listado de Registro en la base de datos
Inicie XCode 4.2 y crear una sola Ver IOS 5
aplicación. Déle un nombre
significativo y seleccione Storyboard y ARC. Configure
su Git, o no, el control de la fuente y completar la creación de su proyecto. (Figura 6).
Figura 6: La Lista de App Vino
Expanda la carpeta Marcos, haga clic derecho en uno de
los marcos y seleccione Mostrar en Finder para abrir el Buscador en el lugar
Marco. Usted tendrá que añadir el
archivo libsqlite_3.0.dylib a su proyecto (figura 6), por lo que subir dos o
tres niveles (ver Ir al Encerrando carpeta en el menú Finder) hasta llegar a la
carpeta usr. Abrirlo y abra la
carpeta lib. Desplácese hacia
abajo hasta encontrar el sqlite_3.0.lib. Arrastre
el archivo a sus marcos, teniendo cuidado de no copiar el archivo en los
marcos, pero sólo crean una referencia (Figura 7). A continuación, seleccione la raíz del
proyecto, haga clic derecho y seleccione Mostrar en Finder. Busque la base de datos SQL que ha
creado en la primera parte de este tutorial y copiarlo en el grupo de proyecto
en la que proyectas encabezado y archivos implementaciones son (Figura 8).
Copie el archivo de base de datos a la carpeta del proyecto
Operaciones DAO Configuración
·
wineId
·
vino
·
clasificación
·
foto
·
@ Sintetizar
wineId;
·
@ Sintetizar
vino;
·
@ Sintetizar
calificación;
·
@ Sintetizar
foto;
Figura 9: Crear la clase winelist
Figura 10: Crear la clase WineLists
Figura 11: La cabecera de carta de vinos
Crear Operaciones CRUD
Bueno CRUD
es un poco exagerado. Para este tutorial en realidad es sólo una operación
de R (lectura). Ok, ahora la aplicación se va a necesitar clases DAO para
el CRUD (Leer) las operaciones, por lo que si aún no lo ha hecho, cree una
nueva clase de Objective-C: MyWineLists o lo que quieras, siempre y cuando la
declaración y las obras de ejecución. Para el archivo de cabecera
MyWineLists, un objeto sqlite3 es declarado y un método NSMutableArray (figura
11):
·
db
·
getMyWines
Para
implementar estos objetos, abra el archivo MyWineLists.m. En este archivo,
la tripa si las operaciones se llevarán a cabo. Para comenzar a crear el
método getMyWines NSMutableArray y agregue una variable puntero array:
·
wineArray
Siguiente
declarar un objeto NSFileManager, un objeto NSString y un objeto Bool:
·
filemgr
·
dbPath
·
éxito
...
·
sql
·
SqlStatement
...
La ejecución de WineLists
Las operaciones CRUD
Comience por localizar y abrir el archivo de guión
gráfico. Usted debe tener una
sola escena en blanco (View Controller). Para
esta parte, se requieren cuatro etiquetas (UILabel): uno para Vino Nombre y el
valor de la base de datos y lo mismo para los otros dos: uno para Wine
Valoración y el valor correspondiente de la base de datos que se almacena en el
NSMutableArray. Para las
imágenes, arrastre un UIImageView en la escena. Como paso final para la interfaz de
usuario, arrastre un UIToolbar y colóquelo en la parte inferior de la pantalla
y cambiar el nombre del botón incluido: Siguiente Botella (Figura 14).
Conexión de los puntos
La estructura del proyecto
Para
finalizar la aplicación, algo de código necesita ser añadido a la cabecera
ViewController y archivos de implementación. Así que para configurar el
IBAction y IBOutlet, abra el archivo de cabecera junto con el guión gráfico
haciendo clic en el Editor Adjunto, el icono de la cara en la barra de
herramientas (Figura 14). Para empezar, seleccione la primera etiqueta y
arrastrando una línea de conexión (Ctrl + botón del ratón a la izquierda) en el
fichero de cabecera entre la última llave de cierre y la directiva @ end. En
la ventana emergente, seleccione IBOutlet e introduzca un nombre como:
winename. Continuar con la segunda etiqueta que contendrá la información
de clasificación. Esto también será una IBOutlet y el nombre será:
winerating. Para la imagen, repita la misma operación que los dos
anteriores. Esta conexión también será un IBOutlet y el nombre será:
wineViewer.Finalmente, arrastre una línea de conexión desde el botón en la
barra de herramientas.
Esta será
una IBAction y el nombre del método: GetWineListing. También agregue un objeto
NSMutableArray:
·
vinos
Usted debe
haber poco lleno en punto en el margen que indica que se han realizado las
conexiones. Siguiente Abrir el archivo de implementación. Configurar
el getter y setters: ... @ sintetizar wineViewer; @
sintetizar winename; @ sintetizar winerating; @ sintetizar vinos; ... En
el viewDidLoad, que se llama cuando la aplicación haya finalizado la
inicialización de sí mismo, añadir punteros para contener los datos iniciales
de la matriz de modo la aplicación mostrará un poco de información y la imagen
que se encuentra en el índice 0. ... - (void) viewDidLoad { MyWineLists
* mywines = [[MyWineLists alloc] init];self.wines = [mywines getMyWines]; [self.wineViewer
setImage: ( (carta de vinos *) [self.wines objectAtIndex: 0]) de la
fotografía];. [self.winename setText: ((carta de vinos *) [self.wines
objectAtIndex: 0].) vino];
Pon a prueba
tu App
Hemos
terminado. Haga clic en el botón Ejecutar para iniciar la
aplicación.Después de la aplicación ha terminado de inicializar usted debe
tener a partir de datos y la imagen en la pantalla. Haga clic en el
siguiente botella para obtener el siguiente listado.
Aquí está el código fuente completo de los diversos
archivos que se crearon.
/ /
/ / WineList.m
/ / MyWineList
/ /
/ / Creado por Kevin Languedoc en 11/25/11.
/ / Copyright (c) 2011 kCodebook. Todos los derechos reservados.
/ /
# Import "WineList.h"
@ Winelist aplicación
@ Sintetizar wineId;
@ Sintetizar vino;
@ Sintetizar calificación;
@ Sintetizar foto;
/ / Con ARC, si ha seleccionado id, usted no necesita dealloc
@ End
--------------------------------------
No hay comentarios:
Publicar un comentario