[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]