[MUSIC] Muy bien. Entonces a continuación, lo siguiente que voy a hacer es precisamente comenzar a crear mi base de datos. Este es mi modelo, esto es lo que tengo por aquí. Tengo mi tabla contacto. Y mi tabla contactolikes. Y entonces lo que voy a estar trabajando es por aquí. Primeramente vamos a crear nuestra clase. Una clase, vamos a dar click derecho a new java class. Una clase que va a ser nuestra clase de base de datos auxiliar. Esta clase como vimos vamos a estar heredando de SQLite. SQLiteOpenHelper, este es el que necesitamos, SQLiteOpenHelper. Entonces vamos a, aquí vamos a darle un Alt + Enter y lo que nos solicita es implementar los métodos. Los implementamos. Necesitamos esos dos. Y vamos a ver de nuevo. Le decimos OK. Y you está, perfecto. Otra cosa que vamos a implementar, que seguramente nos esta pidiendo por aquí, es un constructor. Efectivamente vamos a darle aquí y vamos a implementar este constructor, el primero, el primero que vemos por aquí. Vamos a darle OK. Listo. Si hay que meter este constructor, voy a quitar todo lo que tengo por acá, todo esto, menos context. Entonces desde context en adelante quitamos todo así. Y entonces yo voy a crear por aquí una variable global private, una variable global que esté manejando mi contexto. Por aquí lo que tengo después de super le vamos a poner this.context; bien. Lo siguiente que nos está solicitando por acá, lo siguiente que, bueno por aquí nos falta poner contexto. Lo siguiente que nos esta solicitando es colocar el nombre de la base de datos que ahorita vamos a ir para allá, vamos a ver como vamos a estar manejando el nombre de la base de datos. La fábrica, vamos a poner este dato en nulo y la versión, que también es, este dato y este dato, el nombre y la versión, los vamos a estar manejando en una clase auxiliar. Una clase auxiliar que me va a ayudar a va a funcionar como una clase de constantes, por decirlo así. Y entonces esta clase va a tener todos los datos principales de la base de datos, como el nombre, la versión, el nombre de las tablas, el nombre de los campos, etcétera. Entonces vamos a dar clic derecho, new, Java Class Y vamos a ponerle ConstantesBaseDatos. Por aquí me equivoqué un poquito, vamos a cambiar esto. Vamos a dar un refactor y un rename Constante base de datos. Lo que hace el refactor es que es, si estás cambiando el nombre de alguna variable o de alguna clase. Detecta dónde más tienes ubicado esos datos o dónde más los tienes referenciados. Y automáticamente hace el refresh para todos los demás lugares donde los tienes referenciados. Entonces lo primero que voy a declarar por aquí va a ser public static final. Y los declaramos así porque son constantes. Le voy a poner DATABASE_NAME. Y dijimos que el nombre de la base de datos se va a llamar contactos. Listo. you tengo el nombre de la base de datos. Tengo esto primero, lo siguiente es que de nueva forma voy a colocar un public static final y este va a ser un valor entero y va a ser la versión de la base de datos. Los dos datos que dejamos pendientes hace un momento. Vamos a poner aquí DATABASE_VERSION. DATABASE_VERSION y la vamos a inicializar en 1. Será la versión de la base de datos. Bien, entonces aquí en el name pues simplemente con ayuda de mi clase, mi clase que además esta clase va a ser una clase final. Lo cual va a querer decir que nadie va a poder alterar estos datos por ser una clase constante. Entonces simplemente podemos accesar a los datos entonces voy a poner el DATABASE_NAME y el DATABASE_VERSION, aquí está. Ahora, lo siguiente que vamos a poner es, vamos a estar trabajando nuestro método OnCreate de la base de datos. Entonces en el método OnCreate de la base de datos lo que se crea en realidad es la estructura de la base de datos. Es decir, todas mis tablas y toda la composición de mis tablas tal como están y lo que conocemos como create table, el nombre de la tabla, etcétera, etcétera. Entonces pues eso es lo que va a estar en mi método onCreate. Donde realmente se crea la base de datos es cuando yo genero un objeto de mi clase. Y entonces, lo construyo a través del método constructor. Y en este método es donde ocurre toda la magia de creación de la base de datos. Si la base de datos existe, simplemente pues la abre, pero si no existe crea una base de datos. Entonces aquí en un create vamos a generar un query, voy a poner: string queryCrearTablaContacto String queryCrearTablaContacto. Y este va a ser pues un string que va a contener el query de mi tabla para crear mi tabla contacto. Entonces voy a poner aquí CREATE TABLE. Lo siguiente vendría siendo, pues aquí está mi tabla contacto. Eso es ahorita lo que estoy creando por aquí. El nombre de la tabla, se llama contacto. Mi base de datos se llama contactos, la tabla se llama contacto. Éstos van a ser los campos que vamos a crear. Éstos son los tipos de datos y entonces vamos a poner un create table. Y entonces vamos a poner en nuestra clase de constantes, pues todas las constantes que serán. El nombre de la tabla, el nombre del campo id, el campo nombre, el campo teléfono, email, así sucesivamente para simplemente estarlos llamando. Cada vez que querramos. Entonces vamos ahí a crear nuestros campos, le voy a poner public static final y le vamos a poner string y le vamos a poner por acá table contacts. Aquí voy a poner el nombre que se va a llamar contacto; entonces ahora seguiremos creando. Voy a estar por aquí copiando esto para que sea más sencillo y ahora table contacts se va a llamar _ID. Y aquí va a tener el nombre del campo ID, así como está que estamos en este es el ID, después pondremos el nombre, después el teléfono y así sucesivamente. Vamos a dar de nuevo control V, contacts, seguiría el nombre y entonces aquí le voy a poner nombre. Control V nombre, faltaría teléfono. Entonces por aquí ponemos el teléfono y así esto es una buena práctica puesto que de esta forma mis campos de la tabla permanecen constantes y entonces si en algún momento mi tabla llegase a cambiar. Pues únicamente voy a este archivo y cambio la estructura de la variable, le cambio la variable y you automáticamente en todos lados donde esté referenciando esto, se va a se va a actualizar. Entonces son variables globales o súper globales porque son estáticas. you está lista mi primera tabla contacto, lo que voy a hacer por acá es entonces que voy a empezar a concatenar todo para generar el query create table. Entonces voy a poner aquí constantesBasesDatos y lo primero que me dice es el database name. Y entonces una vez que pongo create table vienen mis paréntesis para empezar a colocar los nombres de los campos. Y el primer campo, vamos a cerrar esto, le vamos a poner un más. Para que se vea esto mejor, este código esté más presentable así lo vamos a poner. Y entonces aquí ponemos un más (+) y entonces lo que vamos a poner va a ser constantesBaseDatos punto (.) primero el ID. Entonces le voy a concatenar integer primary el tipo de dato que va a fungir en la tabla va a ser un valor entero, va a ser nuestra idea primaria y además va a ser autoincrement. Ponemos una coma (,) para seguir con el siguiente nombre del campo, le voy a dar un enter por aquí Y ahora, constantesbasesdatos seguiría el nombre. Ponemos el nombre y concatenamos despacio y en el caso de para manejar los tipos de datos de texto en SQLite se maneja como tipo text. Okay, luego es una coma (,). Seguimos concatenando. Voy a empezar a copiar desde aquí. Voy a poner aquí. Y ahora iremos con teléfono, así. Seguiría email, vamos a poner aquí email y ahí está. Y por último faltaría la foto. Aquí está la foto. Entonces voy a ordenar esto un poquito mejor, que se vea mejor así y a quitar esto. Entonces ahí está la foto, la foto según estoy viendo, según vamos a ver la foto es un valor entero también. Entonces aquí la foto no debería ir como texto debería ser INTEGER, así y entonces como aquí se cierra y aquí termina. Entonces you no lleva coma aquí está nuestra sintaxis que esto you es parte de conocer más el lenguaje SQL. Create Table el nombre de la tabla, abrimos paréntesis y entonces empiezan a venir todos los nombres de los campos, seguidos del tipo de dato y el rol que van a fungir dentro de la tabla. Entonces tenemos el Query listo. Ahora vamos a ejecutar nuestro siguiente, vamos a poner por aquí, vamos a ejecutar este query .execSQL, lo que va a recibir es el query CrearTablaContacto y listo. Perfecto, eso es lo que voy a estar ahí trabajando. Voy a aprovechar y aquí mismo voy a estar creando ahora la tabla de contacto likes. Para la tabla de contacto likes voy a darle por aquí un enter, y vamos a ejecutar, vamos a crear un objeto que se llame queryContacto, queryCrearTablaLikesContacto. Así lo voy a manejar, tu puedes darle el nombre que gustes. Y si se te ocurre algo más simplificado, pues adelante entonces le voy a poner create table, concatenamos el nombre de nuestra tabla, que aún no lo ponemos. Le vamos a poner table likes _CONTACT. Y como aún no lo creamos pues nos aparece así en rojo, le voy a dar un alt enter, y le voy a decir que cree el campo, así, listo. Lo vamos a inicializar como like, como se llama por acá, contacto_likes. Nos falta aquí que sea final. you está. Listo, you no debe marcarnos en rojo y le vamos a decir que vamos a empezar a definir nuestros paréntesis, aquí le vamos a poner más abrimos, cerramos. Vamos a dar un enter. Otro enter y aquí vamos a empezar a poner nuestro id. Le vamos a decir TABLE_LIKES_CONTACT_ID. ¿Okay?. Como no está, le vamos a decir que lo cree. Que sea final y entonces que se llame. Id. Regresamos por acá Y decimos que sea un INTEGER PRIMARY KEY AUTOINCREMENT tal cual como estaba en el anterior. Ponemos su comita, seguimos concatenando, vamos a copiar esto y sigue aquí nuestra llave foránea que es ID_CONTACTO. Entonces vamos a crear aquí ID_CONTACTO. Vamos a crear el campo. Lo voy a llamar ID_CONTACTO, you está aquí, muy bien y adicional tenemos número de likes. Todavía no hemos dicho, todavía no hemos asignado que esta sea la llave foránea ahorita lo vamos a hacer en la siguiente instrucción. Entonces mientras tanto vamos con el campo número de likes, vamos a copiar, ahí está y vamos a ponerle aquí número likes de nueva cuenta, ahí está. Se debe de llamar número_likes. Ahí está. Perfecto. Entonces ahora sí vamos a empezar a decir; este número de likes pues aquí, este pues nada más podemos tener una llave primaria. Entonces lo quitamos así, y también de este lo quitamos. Entonces número de likes es entero, todos estos dos son enteros. En realidad pues toda la tabla se compone de enteros. Listo. Está el número de likes y ahora vamos a empezar a decir nuestra llave foranea. ¿Quién será? Voy a poner aquí más. Voy a empezar a decir Foreign Key, le voy a decir quién será mi foreign key. Vamos aquí a concatenar la foreign key que será constantes y será id contacto punto. ID_CONTACT esa será mi foreign key y vamos a decir que esta foreign key hace referencia. Vamos a dar un enter Ahí está. No olvides el espacio que lleva. Entonces vamos a poner aquí REFERENCES. A la tabla contactos. Aquí está, contacts. Aquí lo siguiente es poner entre paréntesis el campo. Al campo de la tabla contacts que en este caso es pues el ID. Y vamos a poner aquí, vamos a concatenar. Esto parecía un poco confuso porque estamos concatenando muchas, puras variables, pero bueno. Así será, aquí está, listo. Ahora sí y listo entonces aquí you está cerrando el CREATE_TABLE. Tenemos CREATE_TABLE el nombre de la tabla abre nuestros paréntesis, enseguida vienen los campos. El primer campo es el ID, es un entero layer el primario. Después viene el ID del CONTACTO, el NUMERO_LIKES ambos son campos enteros y entonces a continuación de signo quien es mi llave foránea. Digo que esta es mi llave foránea ID Contacto, y le digo que esto proviene de la tabla contact, del campo id. Entonces una vez que you tengo mi query, simplemente lo mandamos llamar aquí. Ponemos el query así. Entonces, de acuerdo con esto, lo correcto será primero crear una tabla de contacto y luego la tabla likes contacto. Ok. you tenemos listo nuestras tablas you se han creado aquí. Entonces vamos nada más con el método onUpgrade. Y el método onUpgrade lo único que hará será con ayuda de este objetito este método lo ejecutaremos solamente si necesitamos reestructurar la base de datos. Este igual que OnCreate afecta la estructura de la base de datos y no como tal al nombre de la base de datos que es lo que se podría entender. Entonces igualmente onUpgrade va a afectar a la base de datos. Entonces a la estructura de la base de datos yo le puedo decir que aquí DROP TABLE IF EXIST y que elimine la tabla CONTACTS y también elimine la tabla CONTACTS que es LIKES_CONTACTS y listo. Y entonces que vuelva a crear la base de datos. Así, que vuelva a ejecutar onCreate. Para ese entonces se supone que yo aquí you tengo otra estructura. Entonces you podré estar ahí trabajando. Entonces you tengo aquí mi base de datos. Esta clase me va a ayudar a estar manejando toda la creación de la base de datos y de su estructura. Entonces vamos a empezar a manejar algunos métodos como un método que ejecutará una consulta a la base de datos. Entonces vamos a hacer el método obtener todos los contactos, obtener todos los contactos de la tabla contactos. Entonces este, si recuerdas, el estándar que colocamos en la capa del interactor que es el constructor de contactos. Dijimos que no importa de donde provenga la fuente siempre voy a estar devolviendo un arraylist de contactos. Entonces aquí son datos aquí ahorita vamos a manejar en esta parte la conexión de nuestra base de datos y entonces esto lo vamos a quitar. No importa de donde provenga yo siempre voy a estar manejando un arraylist de contactos. Entonces eso es lo que voy a estar devolviendo cuando ejecute mi consulta a la base de datos. Entonces voy a ponerle aquí, obtener todos los contactos. Obtener todos los contactos. Y you está. Entonces voy a tener mi arraylist de contacto. Lo voy a instanciar, newArreyList, y aquí vamos a ponerles un return que serán los contactos. Muy bien. Entonces aquí adentro voy a manejar toda la parte de ejecutar un query. Select * from tabla. Entonces para ello voy a poner mi variable string query. Que la tabla que estaré consultando será la tabla Contactos. Entonces voy a poner select * from y el nombre de la tabla la tengo en una constante, contactos. Le vamos a poner ; SQLite y entonces ahora lo siguiente es que you tengo mi query, está aquí viviendo, todavía no lo mando a llamar. Lo siguiente es empezar a abrir la base de datos y en forma de escritura o en forma de sólo lectura. Para ello vamos a poner el objeto SQLiteDatabase, le voy a decir this, esto, de esto que estamos manejando, que esta es la clase de base de datos, entonces dame, getwritabledatabase. Listo. Ahora lo siguiente es ejecutar el query. El query aquí en mi base de datos está, entonces este objeto me va a ayudar a ejecutar mis querys como lo estuve trabajando acá arriba. Le voy a poner db.exec, en este caso vamos a manejar un rawquery porque lo que nosotros necesitamos que nos devuelva es la colección de datos que consultó. El resultado de mi query del selct *from contactos. Entonces el resultado, lo que me da será un cursor. Entonces aquí como primer valor lleva el query y como segundo parámetro me dice que si tengo argumentos. Los argumentos pueden ser si estoy haciendo algún filtro en general. Entonces ahorita no tengo ningún filtro. Le ponemos ; y como dijimos estos datos los necesitaremos recuperar en algún lado y previo utilizaré una instancia de la interfaz cursor. Le vamos a poner aquí registros. Entonces este objeto como tal no son los datos, no son los registros, pero este objeto nos va a ayudar a recorrer los registros. Para recorrer los registros utilizaré un bucle while, le voy a poner registros.moveToNext. Mientras esto puede estarse recorriendo y estar haciendo next, next, next entonces puedo seguir recorriendo los registros. Cuando you no tenga más registros entonces debo salir. Entonces aquí es donde voy a empezar a llenar mi objeto contactos. Voy a poner contactoActual = new. Entonces aquí es donde me va a estar ayudando. Aquí me está pidiendo, dice que you no tengo un constructor de este tipo, vamos a decirle que cree un constructor de ese tipo. Un constructor así vacío para este caso que estábamos trabajando. Entonces you está. Ahora a contacto actual le puedo decir .setId y le voy a decir registros.getInt y lo que recibe es el índice de la columna. Si nosotros analizamos un poquito nuestra tabla, estamos obteniendo estos datos lo que vamos a estar aquí trayéndonos es esta columna o este campo en que dice en qué ordenamiento está ubicado. Los índices están ubicados a partir del cero. Entonces este sería el cero, para el campo nombres sería uno, para el de teléfono dos tres, cuatro y así sucesivamente. Entonces yo quiero ahorita extraer el ID, entonces este sería el cero. Entonces getInt y voy a poner 0. Ahora contactoActual.setNombre, sería el 1. Aquí nos falta registros.getString 1, contactoActual.setTelefono. [COUGH] Y entonces lo que estamos haciendo aquí es que simplemente construir el objeto que vamos a almacenar en en nuestra lista contactos. Una vez que el objeto you esté listo, you esté construido you lo voy a poder proceder a almacenar con su método add a arraylist de contactos. Entonces el teléfono va en el 2. Vamos a ver cómo vamos por aquí, sí 0,1,2,3 y 4. Le voy a poner contactoActual.setEmail, vamos a poner registros.getString 3 y vamos a poner contactoActual.set, ahorita vamos por la foto, registros.getString y vamos a poner aquí el 4. Bien, entonces aquí la foto es una entera entonces va a ser una getInt. Listo. Entonces ahorita lo que me faltaría, si observas un poco, contactoActual seguiría colocar los likes. Entonces para ver cuántos likes tiene ese objeto entonces vamos a estar aquí consultando nuestra tabla en contactos, likes, para poder estar trayendo los likes de ese contacto. Entonces en un momento haremos esto, ahorita lo que haremos será pues simplemente esto aquí construido. Y a nuestro objeto contactos vamos a utilizar el método add y entonces le pasamos contacto actual. Y entonces así tantos contactos tengamos se estará rellenando la lista contactos y será finalmente lo que devolveremos, la lista you llena. Es muy importante que siempre después de haber ejecutado una conexión, haber ejecutado un query siempre cerremos todas las conexiones.cerremos todo lo que tengamos aquí. Porque sino estaremos dejando conexiones abiertas y eso va a traer errores en nuestro proyecto. Entonces you está esta parte. Debemos obtener todos los datos del contacto y entonces lo siguiente sería en nuestro constructor de contactos. En vez de obtener los datos de una ArrayList que nosotros mismos construimos a manita.vamos a comentar esto sería más bien ejecutar. La conexión a mi base de datos. Entonces voy a poner mi objeto db. Le voy a instanciar. Le voy a poner BaseDatos. Me solicita el contexto. Le paso aquí está mi objeto contexto. Punto y coma. Y entonces aquí podré estar devolviendo return db.obtenerTodosLosContactos. Si yo corro esto en realidad you estaría listo nuestro proyecto, you podríamos correrlo pero nuestro proyecto no nos mostrará nada pues nuestra base de datos es nueva y va a estar vacía. Entonces vamos a crear un método aquí un método que nos ayude a estar insertando un par de contactos. Public void insertarContactos y va a estar recibiendo el objeto db entonces pues este método insertarContactos lo vamos a definir acá también en nuestra base de datos y le vamos a poner public Void. Insertar. Contacto y entonces aquí no importa cuantos contactos reciba pues este método lo puedo estar llamando muchas veces. Entonces para insertar un contacto necesitaré un objeto que se llama ContentResolver ContentResolver. Entonces aquí voy a poner mi SQLiteDatabase y voy a abrir mi base de datos. Le voy a poner getWritable database entonces voy a ejecutar el comando db insert. Entonces si observas aquí estoy echando mano de los métodos que you vienen definidos en el objeto SQLiteDatabase y entonces de esta forma puedo evitar vulnerabilidades de SQLinjection. Entonces este método insert recibe como primer parámetro el nombre de la tabla. Después vamos a colocar un null y después viene el content en vez de un contentResolver es un ContentValues. Es un contenedor de valores. Este ahorita vas a ver como lo vamos a estar utilizando. En realidad este ContentValues va a tener asociado el valor Con su respectivo campo. El valor del campo y el campo. Lo que conocemos como diccionarios o tipo de clave valor. Entonces por aquí, pues si abrí la conexión, es importante. Cerrarla. Entonces este método InsertarContacto you es genérico lo podemos estar llamando tantas veces querramos. Entonces aquí donde tenía mi constructor contactos le voy a poner insertarTresContactos. InsertarTresContactos. Y lo primero será generar mi objeto contentValues. Igual a new ContentValues. Y le voy a poner values. ContentValues.put y como observas pues recibe la clave que en este caso la clave es el nombre del campo. Como observas tenemos todos estos tipos de datos disponibles entonces lo que haré será ponerle el nombre al contacto a través de mi constante. Voy a utilizar el campo nombre. Y le pondré aquí. Vamos a poner estos datos que you tenemos acá. Anahí Salgado. Lo siguiente será ahora rellenar. El siguiente campo de la tabla que será el teléfono. Y entonces el teléfono es esto que tenemos aquí. Lo siguiente será. Después del teléfono, el email. Y le ponemos aquí el email que habíamos puesto. Ahí está el email. Y por último, la foto. Ahí está la foto. Y le vamos a poner que la foto proviene de drawable, acá anda. Ahí está. Entonces you tengo listo mi contentValue. Lo que haré ahora será llamar a mi método insertarContacto, que recibe los valores, you vienen asignándose el valor respectivo a su campo. Como se observa aquí, el valor respectivo a su campo. Y entonces ahora, a través de este objeto que estoy recibiendo, le vamos a decir insertar contacto, y va a recibir el contentValues. Esto lo puedo hacer por aquí pues un par de veces más porque la idea es insertar tres contactos. Y simplemente ahora vamos a poner los datos de Pedro Sánchez para que esto no se vea igual. Mireya López. Y como observas aquí you no estoy manejando el campo likes constante como lo tenía hace rato. Esto es porque la idea es que el campo like se esté ejecutando dinámicamente. Es decir, cada vez que una persona le de like al icono del like. En ese momento pues. Se inserte un registro en la base de datos y entonces ese campo likes pues se esté trayendo en realidad de la base de datos. Se esté generando dinámicamente. Esto me va a ayudar, así you no voy a tener hardcodeado el campo likes, y entonces se va a estar generando dinámicamente. Voy a generar persistencia. Perfecto, you tengo mis tres datos. Aquí no mas llamaría a ese método insertar tres contactos y le pasaría el método db que es la base de datos Listo. Recuerda que tenemos separada esta capa, entonces podemos ver qué pasa. Vamos a quitar esto de aquí. Y vamos a poner los mensajes. Listo. Okay. Y vemos que nos está marcando un error, select from, dice que no detecta la tabla contacto. Vamos a ver mas arriba que pasó. Dice que no encuentra la tabla contacto, entonces hay un error insertando estos datos. Y efectivamente esto está pasando, porque aquí colocamos el data base name en vez de la tabla contactos. Ok. Para que esto vuelva a correr es necesario que desinstalemos la aplicación porque lo que sucede es que cuando la aplicación se instala, pues genera you la base de datos. Entonces nosotros queremos que se refresque, que se vuelva a crear la base de datos pero ahora con esta estructura. ¿Okay?, lo corremos de nuevo. Y listo, aquí están you nuestros contactos, solamente insertamos tres, son los tres que insertamos. El campo de likes todavía no está disponible, y entonces de esta forma estamos generando, estamos aprovechando nuestro modelo vista presentador manteniendo nuestra capa de datos independiente. Este es nuestro interactor que lo único que está haciendo es traer los métodos de alguna fuente. Estos métodos se implementan y lo único que haces es implemantarlos con la fuente de datos, que en nuestro caso en este momento es la base de datos. Si queremos ver como se está trabajando nuestra base de datos podemos abrir Android Device Monitor y ver que es lo que está pasando, donde se está generando nuestra base de datos. Como vimos en los vídeos anteriores la base de datos se está generando empaquetada en la aplicación. Aquí está. Voy a seleccionar mi emulador y está en la carpeta data, /data, y seguido del nombre del paquete de la aplicación, que en este caso es antcode. Viewfragment y aquí está la carpeta data bases y aquí debe estar nuestra tabla contactos. Entonces de esta forma nos estamos asegurando que aquí está la base de datos. Bien, pues ahora vamos a ver cómo podemos manejar nuestra parte de los likes. Que esto esté degenerando dinámicamente y se esté insertando en la base de datos. [MUSIC]