Muy buen video, bien explicado. Sobre el error que últimamente a la mayoría les sucede sobre "on a null object reference" en "val app = applicationContext as PersonApp" Lo solucione cambiando "val app = applicationContext as PersonApp" Por val app by lazy { applicationContext as PersonApp } Además que la clase "MyActivity" no sea "abstract"
@@devexpert_io Me siguió causando problemas y ni agregando la clase al manifest pude solucionarlo. Termine cambiando solo un poco el codigo en base a otro tutorial y eliminando el PersonApp. Gracias por tu contenido, sigo al pendiente
Excelente video Antonio!... Tengo 3 preguntas para ti. 1. Podrías hacer un video avanzado de Room, en donde incluyas migración de base de datos y unit testing? 2. Que tal sencillo seria construir el DAO desde un archivo .db ya existente? 3. Seria estupendo ver un ejemplo corto pero con más detalle del uso de Room + Livedata
Tengo pendiente hacer vídeos del 1 y del 2. Para el 2 hay una nueva funcionalidad en Room que te permite prepoblar la base de datos, pero no sé cómo funciona ni de dónde se obtienen los datos. Lo que pasa que se me van acumulando temas, así que no puedo prometer cuándo los haré 😅
Madre mía!!!En 16 minutos de video me acabas de aclarar 20 páginas de uso de SQLite y dos horas de videos de programación multimedia y dispositivos móviles de DAM de Ilerna....y oye, mira que los has explicado bien, fácil, y claro. Qué sería de los que estamos empezando sin estos videos maravillosos. Mil gracias!!!!
Gracias Antonio por el vídeo, a mí me encanta el autocompletado de las Query, cuando tienes muchas entidades ayuda mucho. Los quebraderos de cabeza los tengo con los Date 🤦 y todavía no tengo claro si meter suspend, LiveData, los dos, sigo ejemplos y me apaño pero tengo que experimentar más con eso, saludos!!!
Gracias! Me apunto como idea algún vídeo más avanzado. Lo de modelo de presentación te refieres a algo como MVP o MVVM? En realidad eso tiene poco que contar. Sería igual pero en otra clase. Si no lo he entendido bien, cuéntame!
@@devexpert_io Así es con MVP O MVVM en qué parte estaría implementada la DB y organizada la estructura que mencionas en este video 😃. Quedamos ansiosos de ver más de tu contenido y videos muchas gracias por todo.
Muchas gracias por el video. Como siempre, claro y directo. Tengo un par de preguntas: 1. He visto en algunos tutoriales que la base de datos la crean siguiendo un patrón singleton con algunas especificaciones para evitar problemas por acceso "multi-threading". ¿Cuál de los dos enfoques es más conveniente? 2. ¿Hay algún problema en que las dataclasses que son las entities de room incluyan funcionalidad adicional (aparte de la implícita de las dataclasses)? Es decir, funciones a medida particulares para la realización de determinadas tareas.
1. Pudiendo crearlo en el application, o inyectado con un inyector de dependencias, no veo la necesidad de un singleton. 2. Creo que técnicamente no hay problema, aunque no lo he probado...
Gracias por la respuesta. 1. ok. Es que nunca había extendido la Application para nada. 2. Efectivamente, no parece que haya problema. He probado con una clase muy simple, con un par de métodos (en este caso, en un companion object) y ha funcionado: los datos se guardan y recuperan correctamente. Ha funcionado tanto si califico la clase como 'data class' como si no. Saludos.
Tengo pendiente hacer una serie de vídeos sobre Flow, y justo para eso hice este vídeo 😬, para luego poder usar una base de datos con Flow sin tener que explicar Room. Así que ahí va el spoiler 😆😆
@@devexpert_io muy cierto, actualmente la preferencia para nuevo desarrollo viene siendo Room inclusive proyectos legacy vienen haciendo transición poco a poco aprovechando que Room tiene muchas ventajas y sobre todo se acopla muy bien con la Arquitectura de Componentes, y muchísimas gracias, ya estoy ansioso por ver que nuevo material prepararás 😁😁😁
Muy buen video la mejor explicación de implementación de room, no se si exista una forma de actualizar la base de datos con la inyección de un JSON o podrías hacer un video sobre eso
Te refieres a precargar la base de datos la primera vez que se abre la App, o a descargar un json de un servidor y cargarlo en una base de datos? Gracias!
@@sergioalvarez9913 ok, tengo algunas cosas en mente donde algo así podría encajar. Pero tengo que definirlo bien y ver si es viable. Pensaré en ello! Gracias 🙇
Excelente video. Tengo una duda, como podria resetear el contador id, cuando elimino todos los elementos de mi tabla? Es que cuando comienzo a meter registros empieza agregar desde el ultimo id que habia generado anteriormente. Te agradeceria mucho si me pudieras ayudar. Saludos desde Mexico.
Pues la verdad que no lo sé, nunca lo he necesitado... Haciendo una búsqueda, esto es lo primero que me aparece, no parece que haya una opción muy directa... stackoverflow.com/questions/50878734/android-room-how-to-reset-auto-generated-table-primary-key-on-each-app-run
Estoy empezando a crear apps pero no tengo claro como poner una base de datos que tengo en local (tabla de Excel por ejemplo) en la propia app, es posible eso?? Muchas gracias por tus vídeos!!
muy bueno el video, bien explicado, queria consultar sobre personapp que extiende de application, solo hay que aclarar el name en el manisfest no? xq me da error cuando quiero iniciar la val app en el MainActivity, Attempt to invoke virtual method 'java.lang.Object android.content.Context.getSystemService(java.lang.String)' on a null object reference por lo que entiendo en es el context en PersonApp, cuando construyo el room
Hola, a qué te refieres con lo de ' aclarar el name en el manisfest', tengo ese mismo error y no sé cómo resolverlo. Ya añadí al manifest el nombre pero nada, sigo con el error al ejecutar la app Esto fue lo que añadí al manifest:
hola antonio creo que realice todo tal cual explicas en el video pero al momento de ejecutar la app me da un error algo como "entities and pojos must have a usable public constructor and kotlin", como lo corrijo. muchas gracias
@@devexpert_io tengo ya varios años de exp en desarrollo android pero con java. Al ver tus vídeos usando kotlin me dan muchas ganas de aprender el lenguaje.
Buenos días Antonio. Hoy actualicé mi Android Studio a la versión estable de 4.1. Y me encontré con el problema de no poder agregar en el build.gradle(:app) apply plugin: 'kotlin-kpt'. Por lo poquito que entiendo ahora en esta versión se ha modificado la estructura de este archivo ¿PUEDE SER? De entrada cuando inicio un nuevo proyecto viene con la siguiente estructura : plugins { id 'com.android.application' }
Pues la verdad que no lo sé, yo he actualizado literalmente hace 5 minutos. Esa es la nueva forma de definir los plugins en Gradle, me sorprende que hayan pasado por dejar de soportar la antigua sin deprecarla antes, pero todo puede ser... La nueva forma para el plugin de KAPT sería así, por si te sirve: kotlinlang.org/docs/reference/kapt.html#using-in-gradle
Hola antonio como siempre muchas gracias por tus videos, una consulta como podria guardar un texto ya creado osea un tipo "text" en un apartado de favoritos que tengo en mi app y tambien como quitarlo de favoritos con room. Tendras algun tutorial sobre ello? Gracias
Hola Antonio, excelente video. Solo me queda una duda. Por qué al final cuando dices que se puede ocupar con LiveData se le tiene que quitar el suspend?. Esa función de getAll ya no se llamaria desde la corutina entonces? Muchas Gracias de nuevo por esta serie de videos
Buenas, estaba siguiendo el vídeo y cuando quise hacer pruebas, me arrojaba la siguiente excepción Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.content.Context.getApplicationContext()' on a null object reference, no sé a qué se deba, gracias.
@@devexpert_io La tengo como se hace en el minuto 11:47 y de igual forma creo en el main activity la variable app, cómo se crearía en ese caso?, gracias
@@gabrielcastillo7692 a ver si escribo un artículo o algo. En el vídeo hay un fallo, pero ya no se puede cambiar. Es lo que te digo, crear la base de datos en el onCreate del application, en vez de hacerlo directamente como una property
Ahí logré registrar el Kapt en el Gradle. Pero el problema inicial continua. Tratando de depurar veo que es cuando val room = Room .databaseBuilder(this, PeopleDb::class.java, "person") .build(). Y se rompe la ejecución en el emulador "LA APLICACION SE DETUVO"
Pero entiendo que el logcat te dará un error más o menos claro, no? Si quieres pásamelo por email, que hoy vi uno tuyo pero no lo pude contestar. Aunque creo que es eso que ya has solucionado
Excelente Antonio, siempre muy claro y explicaciones fáciles de entender. Me hubiese gustado que trataras el caso especial de los campos tipo Fecha (Date) ya que no es soportado por SQL lite y tu siempre me agregas algo nuevo que no se jejejejeje... Saludos
Hola, muchas gracias, excelente video, tengo una duda si me puedes ayudar, al usar esta librería cada vez que agrego una nueva tabla, me pide eliminar la app de manera completa, como puedo hacer para que esto no ocurra?, gracias!!!
Sí, cuando cambia la estructura de la base de datos, hay que reinstalar, o bien configurar el mecanismo de actualización de la base de datos. Si estás programando y los usuarios no están usando la app, lo mejor es simplemente reinstalar la app y listo
@@devexpert_io Muchas gracias por invitarme, ya me he unido, he estado leyendo de apoco porque hay mucha información importante y aprendiendo un poco de como usar discord. Paso también para agradecerte por el materia tan bueno que se comparte por el canal de youtube
buenas, como puedo obtener un campo en room a partir del valor de una variable?? *tengo 3 columnas id word defword la variable recibe un valor que esta en la columna "word" y en base a esto me devuelve el valor de "defword" gracias!
java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.proyectobasededatos/com.example.proyectobasededatos.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.content.Context.getApplicationContext()' on a null object reference
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.content.Context.getApplicationContext()' on a null object reference
Ya veo... No está bien hacer una property como hice porque en ese punto puede que el application context aún no exista. Poned esa línea después del "setContentView". O se puede usar esa property pero usar el delegado "lazy". Otra opción interesante es hacer una función de extensión con esa línea, pero eso quizá daría para otro video 😅
Muy buen video bien explicado, solo me quedo una duda, es posible realizar cualquier tipo de Query con Dao?, por ejemplo hacer el uso de SUM() o COUNT()?, para tenerlos en variables con LiveData?, Gracias y que tengan buen dia.
@@devexpert_io gracias logre encontrar esta en el directorio data/data/project-package/ en telefono rooteado o en elmulador no hizo falta que este en root .. muchas gracias
Hola Antonio espero estes bien... tu video está muy bueno (bien explicado)... he realizado al pie todo lo que expones... al final se me genera un error "on a null object reference" en val app = applicationContext as PersonApp... espero puedas ayudarme con ello... Gracias por tu amable contribución.
Hola Dino, estoy centralizando las respuestas para todos en Discord, así que te invito a que te unas y traslades tus dudas allí, un saludo! 👉 devexperto.com/comunidad
Hola Antonio, muchas gracias por sus tutoriales, necesito pedirle un favor grande, necesito que nos regales unos tutoriales de GraphQL en Android, para reemplazar retrofit. Y por otro lado quería preguntarle, conoces la app indriver? Si, si, sabes con qué tecnología se pudo haber programado le sección de esa app dónde se negocia los precios de una carrera y el cliente puede ir viendo la lista de solicitudes del transportador que le la lista puede ser un recyclerview pero cada una de las cardview tienen una linea de progreso que disminuye cuando los segundos se acaben, cuando el tiempo se acaba para que en cliente escoja la oferta. Esa sección es en tiempo real, he pensado en socket, he pensado en rx Java, en corrutinas, realmente pienso que indriver está hecha en firebase realtime database.
Buenas de nuevo!! Una pregunta que no he visto formulada. Si tienes una DB con tres o cuatro entities, cómo haces para añadirlas dentro de @Database? he probado dentro de los corchetes y da error y no encuentro nada en developer.android. ¿O tengo que crear una nueva base de datos?. Mil gracias!!!
@@devexpert_io , me da este error: "Type mismatch: inferred type is KClass but Array was expected". Pero me meto en discord a preguntar desde ahí. Mil gracias!!!😃
En Room directamente puedes hacer que un objeto contenga otro objeto, y automáticamente es capaz de buscarlo en tabla correspondiente y recuperarlo. En algún momento haré un vídeo sobre esto, pero mientras puedes echar un ojo a la doc oficial para ver cómo se hace: developer.android.com/training/data-storage/room/relationships
Solo que ahora se usa ksp en lugar de kapt para las dependencias que generan código. En este caso para el compilador de Room. Pero si no lo pones Android Studio te da un warning, así que seguramente lo detectarás rápido.
Hola buen video. Talvez alguien me puede ayudar porfa, al ejecutar el codigo, me da un error de tratar de ejecutar el metodo en un objeto con referencia null. Haciendo referencia a la linea donde se instancia el PersonApp desde el Main
@@devexpert_io Buenas tardes. A mi me ocurre exactamente lo mismo. Error: Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.content.Context.getApplicationContext()' on a null object reference Lei que pusiste de poner la linea donde creo el app luego del setContentView, pero luego el error es: java.lang.ClassCastException: android.app.Application cannot be cast to com.example.personasenbbdd.PersonaApp
Si te quieres dedicar profesionalmente a ello, te lo recomiendo sí o sí. Apúntate a mi Training gratuito (lo puedes encontrar en el primer comentario o en la descripción) porque ahí te doy números para que veas la situación. Un abrazo!
Además de todas las ventajas sobre Java, las búsquedas laborales de Android ya hace tiempo que vienen pidiendo Kotlin como excluyente. Te recomiendo que encares por ese lado totalmente!
@@devexpert_io es decir, creando mas clases e interfaces? ej. ProductoDb, Producto, ProductoApp, ProductoDao. Serías así? ¿Y en cuanto a las relaciones de la base de datos? Sería de gran ayuda!! Muchas gracias!
Para crear una tabla solo necesitas una entity y añadirla en la anotación de @Database, en el listado de entities. Luego si es una entity que tiene vida propia más allá de formar parte de otras entities, entonces merecerá la pena crearle un Dao propio. Lo de las relaciones es otro tema. Tengo pendiente hacer un vídeo en algún momento, pero si no en la referencia de Android está explicado
Hola Jesús, estoy centralizando las respuestas para todos en Discord, así que te invito a que te unas y traslades tus dudas allí, un saludo! 👉 devexperto.com/comunidad
solo una pequeña aclaración, el campo edad(age) no se debe considerar ponerlo, ya que la edad es un dato calculado, se debería poner la fecha de nacimiento. Saludos
@@devexpert_io en la parte que justo decías que no era necesario implementarlo en el manifest, pará que a mí me funcione tuve que implementarlo según lo que encontré en un foro.
se sigue importando lifecycleScope? no me da a pesar de tener: implementation "androidx.room:room-ktx:2.5.0" kapt "androidx.room:room-compiler:2.5.0" implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.5.1" implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4" en mi buildgradle
Muy buen video, bien explicado.
Sobre el error que últimamente a la mayoría les sucede sobre "on a null object reference" en "val app = applicationContext as PersonApp"
Lo solucione cambiando
"val app = applicationContext as PersonApp"
Por
val app by lazy { applicationContext as PersonApp }
Además que la clase "MyActivity" no sea "abstract"
Gracias! Sí, es que en ese punto aún no se puede acceder al contexto, lo grabé mal. Esta es una solución perfectamente válida.
@@devexpert_io Me siguió causando problemas y ni agregando la clase al manifest pude solucionarlo.
Termine cambiando solo un poco el codigo en base a otro tutorial y eliminando el PersonApp.
Gracias por tu contenido, sigo al pendiente
Excelente video Antonio!... Tengo 3 preguntas para ti.
1. Podrías hacer un video avanzado de Room, en donde incluyas migración de base de datos y unit testing?
2. Que tal sencillo seria construir el DAO desde un archivo .db ya existente?
3. Seria estupendo ver un ejemplo corto pero con más detalle del uso de Room + Livedata
Tengo pendiente hacer vídeos del 1 y del 2. Para el 2 hay una nueva funcionalidad en Room que te permite prepoblar la base de datos, pero no sé cómo funciona ni de dónde se obtienen los datos. Lo que pasa que se me van acumulando temas, así que no puedo prometer cuándo los haré 😅
Madre mía!!!En 16 minutos de video me acabas de aclarar 20 páginas de uso de SQLite y dos horas de videos de programación multimedia y dispositivos móviles de DAM de Ilerna....y oye, mira que los has explicado bien, fácil, y claro. Qué sería de los que estamos empezando sin estos videos maravillosos. Mil gracias!!!!
Oh! Pues ya está, me has alegrado el día 🥰. Muchas gracias por tus palabras!
Hola profe , ella un año este video y se le entiende a la perfección siga así , y gracias por tus consejos sirven mucho
Muchas gracias Camilo, en esas estoy!! 😉
Me estás ayudando un montón para hacer mi proyecto final de la FP. ¡Muchas gracias!
oh! qué ilusión, gracias a ti! Si ves que no encuentras algo, dime, por si tengo algún artículo que no tenga en formato vídeo o lo que sea
¡Excelente! Este tema ya lo dominaba pero nunca viene mal recordarlo.
Genial! Gracias por echarle un ojo aún así ☺️
Gracias Antonio por el vídeo, a mí me encanta el autocompletado de las Query, cuando tienes muchas entidades ayuda mucho. Los quebraderos de cabeza los tengo con los Date 🤦 y todavía no tengo claro si meter suspend, LiveData, los dos, sigo ejemplos y me apaño pero tengo que experimentar más con eso, saludos!!!
He visto comentarios con los problemas que comento, la comunidad está en todo!
Gracias por tus comentarios! Sí, hay muchos pequeños detalles que intentaré ir resolviendo en siguientes vídeos.
Muy bueno , sería bueno que tocaras algo de test con room....
Tomo nota! Gracias!
Me sumo a esta peticion
@@ruif3r ok! Gracias!
Una vez más agradezco este material, es de mucha ayuda. Gracias Antonio!
A ti por estar y comentar siempre! Me ayuda mucho a seguir creando contenido. Un abrazo y muchas gracias!
Antonio , gracias por compartir tu conocimiento, tu libro es una obra maestra!
Muchas gracias Augusto!
Muy didáctico y preparado el tutorial. Gracias por compartir, Antonio!
Muchas gracias!
Muy bueno Antonio... sería interesante ver las migraciones de base de datos y algo de test ! Muchas gracias !!!
Lo tendré en cuenta. Gracias!
Excelente video como siempre, estaría bien tener un ejemplo con una base de datos más grande y verlo en algun modelo de presentación
Gracias! Me apunto como idea algún vídeo más avanzado. Lo de modelo de presentación te refieres a algo como MVP o MVVM? En realidad eso tiene poco que contar. Sería igual pero en otra clase. Si no lo he entendido bien, cuéntame!
@@devexpert_io Así es con MVP O MVVM en qué parte estaría implementada la DB y organizada la estructura que mencionas en este video 😃. Quedamos ansiosos de ver más de tu contenido y videos muchas gracias por todo.
Como siempre un gran vídeo, muchas gracias!!, me gustaría que indagaras mas con un ejemplo ORM para no realizar consultas sql directas a la BD.
Ok, lo apunto! Aunque últimamente veo poco uso de este tipo de librerías
Excelente explicacion Antonio, me ayudo mucho, muchas gracias !!
Que alegría! Gracias a ti!
Excelente video Antonio. Estaría muy bien ver más en detalle el apartado de migración así cómo el uso de flow con Room. Un saludo y gracias.
Perfecto, gracias por el feedback!
Muchas gracias por el video. Como siempre, claro y directo.
Tengo un par de preguntas:
1. He visto en algunos tutoriales que la base de datos la crean siguiendo un patrón singleton con algunas especificaciones para evitar problemas por acceso "multi-threading". ¿Cuál de los dos enfoques es más conveniente?
2. ¿Hay algún problema en que las dataclasses que son las entities de room incluyan funcionalidad adicional (aparte de la implícita de las dataclasses)? Es decir, funciones a medida particulares para la realización de determinadas tareas.
1. Pudiendo crearlo en el application, o inyectado con un inyector de dependencias, no veo la necesidad de un singleton.
2. Creo que técnicamente no hay problema, aunque no lo he probado...
Gracias por la respuesta.
1. ok. Es que nunca había extendido la Application para nada.
2. Efectivamente, no parece que haya problema. He probado con una clase muy simple, con un par de métodos (en este caso, en un companion object) y ha funcionado: los datos se guardan y recuperan correctamente. Ha funcionado tanto si califico la clase como 'data class' como si no.
Saludos.
Super entendible maestro, sera que tendrás un video más actualizado con Compose y probando eñ room
En el curso de 3 horas de Kotlin Multiplatform que publiqué el jueves se usa Room
Antonio muchas gracias por el contenido. Como sugieres en el vídeo sería genial tratar un poco el tema de las migraciones. Nuevamente muchas gracias.
Apuntado queda. Gracias!
Genial! Cómo todos tus videos! Todo muy claro 🤓👏👨💻
Muchas gracias Alberto!
Si aún no te decides sobre si Kotlin es el lenguaje que deberías aprender, te animo a que te apuntes a mi masterclass gratuita 👉 bit.ly/3eRcwfu
Buenísimo video Antonio, sería bueno que toques el tema de migraciones de base de datos
Gracias Jairo! Lo tengo anotado para próximos vídeos, aunque la lista no para de crecer 😅
Buen vídeo Bro. Aquí aprendiendo sobre room ahora jajjajaja
Gracias! Te estás dando un buen repaso a todos los vídeos, enhorabuena!
Muchas gracias Antonio por tan valiosa informacion.
Gracias!
Muy buen video Antonio. Me gustaria si podes explicar como usar Flow en vez de LiveData. Saludos!
Tengo pendiente hacer una serie de vídeos sobre Flow, y justo para eso hice este vídeo 😬, para luego poder usar una base de datos con Flow sin tener que explicar Room. Así que ahí va el spoiler 😆😆
Muchas gracias por compartir tus conocimientos :D
Un placer!
Excelente video!!!, otro video interesante podría ser otras alternativas que existen ademas de SQLite y Room, como por ejemplo Realm.
Tomo nota para echarle un ojo, porque me da la sensación de que hoy en día todo se está abandonando en favor de Room
@@devexpert_io muy cierto, actualmente la preferencia para nuevo desarrollo viene siendo Room inclusive proyectos legacy vienen haciendo transición poco a poco aprovechando que Room tiene muchas ventajas y sobre todo se acopla muy bien con la Arquitectura de Componentes, y muchísimas gracias, ya estoy ansioso por ver que nuevo material prepararás 😁😁😁
Muy buen video la mejor explicación de implementación de room, no se si exista una forma de actualizar la base de datos con la inyección de un JSON o podrías hacer un video sobre eso
Te refieres a precargar la base de datos la primera vez que se abre la App, o a descargar un json de un servidor y cargarlo en una base de datos? Gracias!
@@devexpert_io Pues Antonio seria en ambas situaciones porque ese tema aun no lo tengo muy claro y los ejemplos que he visto me generan mas confusión
Excelente contenido!! Bien hecho, tambien hace videos para java android ?
Gracias! No, solo hago con Kotlin
Genial Antonio! ¿Tienes pensado Ampliar sobre este tema? A un curso sobre esto yo me apuntaría.. :D
Qué te gustaria ver en un curso así?
@@devexpert_io pues un curso de room, de cero a casos prácticos!
@@devexpert_io este video despierta mucho el interés
@@sergioalvarez9913 ok, tengo algunas cosas en mente donde algo así podría encajar. Pero tengo que definirlo bien y ver si es viable. Pensaré en ello! Gracias 🙇
Algo que sería interesante y que ya comentaron es que se hablara del pre-populate o la aplicación de las migraciones.
Sí, está apuntado, a ver si algún día puedo grabarlo. Gracias!
Claro como el agua. Muchas gracias.
Gracias a ti!
Vendría bien este CRUD completo de Kotlin, mostrando como trabajar con ROOM y como integrarlo con la UI.
Tomo nota!
🙌🏼🙌🏼🙌🏼 se agradece el vidio!
Muchas gracias!! 🤩
Excelente video.
Tengo una duda, como podria resetear el contador id, cuando elimino todos los elementos de mi tabla? Es que cuando comienzo a meter registros empieza agregar desde el ultimo id que habia generado anteriormente. Te agradeceria mucho si me pudieras ayudar.
Saludos desde Mexico.
Pues la verdad que no lo sé, nunca lo he necesitado... Haciendo una búsqueda, esto es lo primero que me aparece, no parece que haya una opción muy directa... stackoverflow.com/questions/50878734/android-room-how-to-reset-auto-generated-table-primary-key-on-each-app-run
@@devexpert_io Vale vale muchas gracias por tu respuesta. Ahí lo checo. Saludos 🙋🏻
Estoy empezando a crear apps pero no tengo claro como poner una base de datos que tengo en local (tabla de Excel por ejemplo) en la propia app, es posible eso??
Muchas gracias por tus vídeos!!
Echa un ojo a esto a ver si te vale developer.android.com/training/data-storage/room/prepopulate
@@devexpert_io muchas gracias!!
muy bueno el video, bien explicado, queria consultar sobre personapp que extiende de application,
solo hay que aclarar el name en el manisfest no? xq me da error cuando quiero iniciar la val app en el MainActivity,
Attempt to invoke virtual method 'java.lang.Object android.content.Context.getSystemService(java.lang.String)' on a null object reference
por lo que entiendo en es el context en PersonApp, cuando construyo el room
Si, el contexto del application
Hola, a qué te refieres con lo de ' aclarar el name en el manisfest', tengo ese mismo error y no sé cómo resolverlo. Ya añadí al manifest el nombre pero nada, sigo con el error al ejecutar la app
Esto fue lo que añadí al manifest:
muy bueno el video, podrías explicar como las migraciones de db, seria de mucha ayuda Saludos
Claro! Lo tengo apuntado, pero se me acumulan los temas 😅. En cuanto pueda le hago un hueco.
A la espera!!!
Ole!
hola antonio creo que realice todo tal cual explicas en el video pero al momento de ejecutar la app me da un error algo como "entities and pojos must have a usable public constructor and kotlin", como lo corrijo. muchas gracias
Entra en el discord y nos compartes código, así podemos ver por qué puede ser: devexperto.com/discord
Excelente video! Gracias!
Gracias!
Muy buenos contenidos Antonio!
Muchas gracias!
@@devexpert_io tengo ya varios años de exp en desarrollo android pero con java. Al ver tus vídeos usando kotlin me dan muchas ganas de aprender el lenguaje.
Buenos días Antonio. Hoy actualicé mi Android Studio a la versión estable de 4.1. Y me encontré con el problema de no poder agregar en el build.gradle(:app) apply plugin: 'kotlin-kpt'. Por lo poquito que entiendo ahora en esta versión se ha modificado la estructura de este archivo ¿PUEDE SER? De entrada cuando inicio un nuevo proyecto viene con la siguiente estructura : plugins {
id 'com.android.application'
}
Pues la verdad que no lo sé, yo he actualizado literalmente hace 5 minutos. Esa es la nueva forma de definir los plugins en Gradle, me sorprende que hayan pasado por dejar de soportar la antigua sin deprecarla antes, pero todo puede ser... La nueva forma para el plugin de KAPT sería así, por si te sirve: kotlinlang.org/docs/reference/kapt.html#using-in-gradle
que bueno sería encontrar un tutorial con esta claridad pero en JAVA.
Yo no hago vídeos en Java sorry, la mayor parte de la gente lo busca ya todo en Kotlin
Hola antonio como siempre muchas gracias por tus videos, una consulta como podria guardar un texto ya creado osea un tipo "text" en un apartado de favoritos que tengo en mi app y tambien como quitarlo de favoritos con room. Tendras algun tutorial sobre ello? Gracias
Gracias! No te sigo muy bien con la pregunta. Si quieres únete al Discord y por allí lo podemos hablar más tranquilamente: devexperto.com/comunidad
Hola Antonio, excelente video. Solo me queda una duda. Por qué al final cuando dices que se puede ocupar con LiveData se le tiene que quitar el suspend?. Esa función de getAll ya no se llamaria desde la corutina entonces? Muchas Gracias de nuevo por esta serie de videos
No hace falta porque Room se encarga de ejecutar las peticiones en segundo plano si usas un Observable (como LiveData)
Buenas, estaba siguiendo el vídeo y cuando quise hacer pruebas, me arrojaba la siguiente excepción Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.content.Context.getApplicationContext()' on a null object reference, no sé a qué se deba, gracias.
Necesitas crear la base de datos en el onCreate() de application
@@devexpert_io La tengo como se hace en el minuto 11:47 y de igual forma creo en el main activity la variable app, cómo se crearía en ese caso?, gracias
@@gabrielcastillo7692 a ver si escribo un artículo o algo. En el vídeo hay un fallo, pero ya no se puede cambiar. Es lo que te digo, crear la base de datos en el onCreate del application, en vez de hacerlo directamente como una property
Pudiste resolverlo?
Ahí logré registrar el Kapt en el Gradle. Pero el problema inicial continua. Tratando de depurar veo que es cuando val room = Room
.databaseBuilder(this, PeopleDb::class.java, "person")
.build(). Y se rompe la ejecución en el emulador "LA APLICACION SE DETUVO"
Pero entiendo que el logcat te dará un error más o menos claro, no? Si quieres pásamelo por email, que hoy vi uno tuyo pero no lo pude contestar. Aunque creo que es eso que ya has solucionado
Excelente Antonio, siempre muy claro y explicaciones fáciles de entender. Me hubiese gustado que trataras el caso especial de los campos tipo Fecha (Date) ya que no es soportado por SQL lite y tu siempre me agregas algo nuevo que no se jejejejeje... Saludos
Eso se hace con TypeConverters, pero me lo apunto para otro vídeo. Gracias!
Hola, muchas gracias, excelente video, tengo una duda si me puedes ayudar, al usar esta librería cada vez que agrego una nueva tabla, me pide eliminar la app de manera completa, como puedo hacer para que esto no ocurra?, gracias!!!
Muchas gracias Jhon, te invito a que te unas y traslades tus dudas por Discord, un saludo! 👉 devexperto.com/comunidad
Sí, cuando cambia la estructura de la base de datos, hay que reinstalar, o bien configurar el mecanismo de actualización de la base de datos. Si estás programando y los usuarios no están usando la app, lo mejor es simplemente reinstalar la app y listo
@@devexpert_io Muchas gracias por invitarme, ya me he unido, he estado leyendo de apoco porque hay mucha información importante y aprendiendo un poco de como usar discord. Paso también para agradecerte por el materia tan bueno que se comparte por el canal de youtube
@@JHONESTIVENGonzalez gracias!
buenas, como puedo obtener un campo en room a partir del valor de una variable??
*tengo 3 columnas
id word defword
la variable recibe un valor que esta en la columna "word" y en base a esto me devuelve el valor de "defword"
gracias!
El video es excelente, pero me tira error al poner val app = applicationContext as PersonApp en el MainActivity
Habría que ver un poco más. Qué error te da?
@@devexpert_io me arroja el mismo error en esa linea
java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.proyectobasededatos/com.example.proyectobasededatos.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.content.Context.getApplicationContext()' on a null object reference
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.content.Context.getApplicationContext()' on a null object reference
Ya veo... No está bien hacer una property como hice porque en ese punto puede que el application context aún no exista. Poned esa línea después del "setContentView". O se puede usar esa property pero usar el delegado "lazy".
Otra opción interesante es hacer una función de extensión con esa línea, pero eso quizá daría para otro video 😅
¿Se pueden realizar mapeos para hacer relaciones con otras tablas, algo similar a JPQL (Spring)?
Sí, te dejo el enlace a la doc oficial developer.android.com/training/data-storage/room/relationships
Muy buen video bien explicado, solo me quedo una duda, es posible realizar cualquier tipo de Query con Dao?, por ejemplo hacer el uso de SUM() o COUNT()?, para tenerlos en variables con LiveData?, Gracias y que tengan buen dia.
Sí, se pueden hacer queries de ese tipo contra Room
y en que directorio del sistema operativo android va a parar la base de dato sqlite ? gracias
Genera una carpeta privada para esa App a la que solo puede acceder ella, por seguridad. En teléfonos rooteados te puedes saltar esa seguridad
@@devexpert_io gracias logre encontrar esta en el directorio data/data/project-package/ en telefono rooteado o en elmulador no hizo falta que este en root .. muchas gracias
Hola Antonio espero estes bien... tu video está muy bueno (bien explicado)... he realizado al pie todo lo que expones... al final se me genera un error "on a null object reference" en val app = applicationContext as PersonApp... espero puedas ayudarme con ello... Gracias por tu amable contribución.
Hola Dino, estoy centralizando las respuestas para todos en Discord, así que te invito a que te unas y traslades tus dudas allí, un saludo! 👉 devexperto.com/comunidad
Hola Antonio, muchas gracias por sus tutoriales, necesito pedirle un favor grande, necesito que nos regales unos tutoriales de GraphQL en Android, para reemplazar retrofit.
Y por otro lado quería preguntarle, conoces la app indriver?
Si, si, sabes con qué tecnología se pudo haber programado le sección de esa app dónde se negocia los precios de una carrera y el cliente puede ir viendo la lista de solicitudes del transportador que le la lista puede ser un recyclerview pero cada una de las cardview tienen una linea de progreso que disminuye cuando los segundos se acaben, cuando el tiempo se acaba para que en cliente escoja la oferta.
Esa sección es en tiempo real, he pensado en socket, he pensado en rx Java, en corrutinas, realmente pienso que indriver está hecha en firebase realtime database.
Hola Erik, pues no conozco nada de ninguno de los dos temas, sorry...
Buenas de nuevo!! Una pregunta que no he visto formulada. Si tienes una DB con tres o cuatro entities, cómo haces para añadirlas dentro de @Database? he probado dentro de los corchetes y da error y no encuentro nada en developer.android. ¿O tengo que crear una nueva base de datos?. Mil gracias!!!
Deberías poder. Qué error te da? Si quieres entra en nuestro Discord y te intentamos ayudar por allí: devexperto.com/discord
@@devexpert_io , me da este error: "Type mismatch: inferred type is KClass but Array was expected". Pero me meto en discord a preguntar desde ahí. Mil gracias!!!😃
Muchas gracias
Gracias por comentar
Excelente video !!!
Gracias!
Muy buen video, solo te tengo 2 dudas, ¿se pueden usa llaves foráneas con room? y si es así ¿qué sintaxis lleva?
En Room directamente puedes hacer que un objeto contenga otro objeto, y automáticamente es capaz de buscarlo en tabla correspondiente y recuperarlo. En algún momento haré un vídeo sobre esto, pero mientras puedes echar un ojo a la doc oficial para ver cómo se hace: developer.android.com/training/data-storage/room/relationships
como puedo definir un string como primaryKey?
saludos, que tanto varia el desarrollo con java, ya que tu lo haces con kotlin
Es prácticamente igual, no sé usa ninguna feature de Kotlin que Java no tenga en este vídeo
Excelente explicacion. Siendo 4/2024, ¿Hay algo deprecated en este video?
Solo que ahora se usa ksp en lugar de kapt para las dependencias que generan código. En este caso para el compilador de Room. Pero si no lo pones Android Studio te da un warning, así que seguramente lo detectarás rápido.
Hola buen video. Talvez alguien me puede ayudar porfa, al ejecutar el codigo, me da un error de tratar de ejecutar el metodo en un objeto con referencia null. Haciendo referencia a la linea donde se instancia el PersonApp desde el Main
Es complicado saber sin ver el código, sorry...
@@devexpert_io Buenas tardes. A mi me ocurre exactamente lo mismo. Error:
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.content.Context.getApplicationContext()' on a null object reference
Lei que pusiste de poner la linea donde creo el app luego del setContentView, pero luego el error es:
java.lang.ClassCastException: android.app.Application cannot be cast to com.example.personasenbbdd.PersonaApp
Comprobad que el contexto que le pasáis a la BD no es nulo
Buen video, y si emulas el código para ver su función en la app?
No entiendo muy bien la pregunta, qué necesitas exactamente?
@@devexpert_io pregunta podrías correr el código en el emulador para ver?
Tengo una duda, yo se java, pero quiero hacer desarrollo android ¿Me conviene aprender con kotlin Por mas que yo ya sepa java y nada de kotlin?
Si te quieres dedicar profesionalmente a ello, te lo recomiendo sí o sí. Apúntate a mi Training gratuito (lo puedes encontrar en el primer comentario o en la descripción) porque ahí te doy números para que veas la situación. Un abrazo!
Además de todas las ventajas sobre Java, las búsquedas laborales de Android ya hace tiempo que vienen pidiendo Kotlin como excluyente. Te recomiendo que encares por ese lado totalmente!
¿Cómo se podría añadir otra tabla en la base de datos? Solo hay una tabla..
El proceso es el mismo, puede añadir tantas como quieras
@@devexpert_io es decir, creando mas clases e interfaces? ej. ProductoDb, Producto, ProductoApp, ProductoDao. Serías así?
¿Y en cuanto a las relaciones de la base de datos?
Sería de gran ayuda!! Muchas gracias!
Para crear una tabla solo necesitas una entity y añadirla en la anotación de @Database, en el listado de entities. Luego si es una entity que tiene vida propia más allá de formar parte de otras entities, entonces merecerá la pena crearle un Dao propio. Lo de las relaciones es otro tema. Tengo pendiente hacer un vídeo en algún momento, pero si no en la referencia de Android está explicado
Me aparece este error: A failure occurred while executing org.jetbrains.kotlin.gradle.internal.KaptExecution
Hola Jesús, estoy centralizando las respuestas para todos en Discord, así que te invito a que te unas y traslades tus dudas allí, un saludo! 👉 devexperto.com/comunidad
Pero cuando llamas a room no estas creando una y otra vez la bd?
No, la base de datos se crea solo una vez, luego realizas conexiones a la misma base de datos
te amo!
Jajaja 🥰
Muy bueno
Muchas gracias!
Hola , tendras algun video de room pero con java ?
No, lo siento...
En resumen, ROOM = Un ORM inspirado en SpringData para Android
Ni idea 😅, pero si se parece a SpringData, puede ser.
podes hacerlo para mssql server
Si quieres proponer temas, puedes hacerlo en: devexperto.com/video-klisst
Sabes ¿cuál es el límite de campos que me permite manejar ROOM en las Entities?.
En principio el límite de SQLite es 2000, pero no sé si Room aplicará algún límite extra, no creo
solo una pequeña aclaración, el campo edad(age) no se debe considerar ponerlo, ya que la edad es un dato calculado, se debería poner la fecha de nacimiento. Saludos
Gracias! Un apunte importante, sin duda
Excelente video como siempre. Que lindas las waifus en la estanteria
😂 no son waifus pero gracias!
¿Cuál es la mejor manera de traer 3 tablas relacionadas con room ?
Tengo pendiente hacer un vídeo del tema, pero puedes leer sobre ello aquí developer.android.com/training/data-storage/room/relationships
@@devexpert_io Gracias
pues no me funciona...
qué te falla?
@@devexpert_io en la parte que justo decías que no era necesario implementarlo en el manifest, pará que a mí me funcione tuve que implementarlo según lo que encontré en un foro.
Y además del uso de singleton
se sigue importando lifecycleScope? no me da a pesar de tener:
implementation "androidx.room:room-ktx:2.5.0"
kapt "androidx.room:room-compiler:2.5.0"
implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.5.1"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4"
en mi buildgradle
Hay que importar activity-ktx para el lifecyclescope