No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Creación de componentes de Room

28/32
Recursos

¿Cómo crear la entidad Transfer en un proyecto de Kotlin?

Para comenzar a trabajar con entidades en tu proyecto de Kotlin, primero necesitas crear la estructura adecuada para almacenar y gestionar los datos en tu base de datos. Aquí, detallamos los pasos que debes seguir para establecer estas bases, comenzando con la creación de una entidad Transfer adecuada.

¿Cómo definir la clase de entidad Transfer?

La entidad Transfer es esencialmente un esquema de lo que será una tabla en tu base de datos. Este es el proceso para su creación:

  1. Creación del paquete y clase de entidad: En primer lugar, dentro del paquete transfers, crea un nuevo paquete denominado Data. Aquí, introduce la clase TransferEntity.

  2. Definición de variables y anotaciones: Utiliza data class para definir tu entidad simplificando la creación de clases de datos:

    @Entity(tableName = "transfer")
    data class TransferEntity(
        @PrimaryKey(autoGenerate = true) var transactionId: Int = 0,
        @ColumnInfo(name = "user_id") var userId: String,
        @ColumnInfo(name = "recipient_id") var recipientId: String,
        @ColumnInfo(name = "transaction_date") var transactionDate: String,
        @ColumnInfo(name = "transaction_amount") var transactionAmount: String
    )
    
    • Usa @Entity para declarar que esta clase es una entidad ligada a la tabla "transfer" en la base de datos.
    • Define las llaves primarias y haz que las columnas sean auto-generadas con anotaciones como @PrimaryKey y @ColumnInfo.

¿Cómo crear el DAO (Data Access Object)?

El DAO asegura que puedas acceder y manipular los datos en la base de datos eficientemente.

  1. Definición de la interfaz DAO: Crea una nueva interfaz llamada TransferDao. Aquí se definirán varias funciones para interactuar con los datos:

    @Dao
    interface TransferDao {
        @Query("SELECT * FROM transfer")
        fun getAllTransfers(): List<TransferEntity>
    
        @Query("SELECT * FROM transfer WHERE user_id = :userId")
        fun findTransfersByUserId(userId: String): List<TransferEntity>
    
        @Insert
        suspend fun insertTransfer(transfer: TransferEntity)
    
        @Delete
        suspend fun deleteTransfer(transfer: TransferEntity)
    }
    
    • @Dao indica que esta interfaz proporciona métodos para acceder a la base de datos.
    • Usa anotaciones como @Query, @Insert, y @Delete para realizar operaciones CRUD.

¿Cómo establecer la conexión con la base de datos?

Para que tu aplicación acceda a la base de datos, necesitas configurar la conexión con ella.

  1. Configuración de la clase de la base de datos:

    Crea una clase llamada ApplicationDatabase, que extienda RoomDatabase, donde se definirá cómo crear y acceder a la base de datos:

    @Database(entities = [TransferEntity::class], version = 1)
    abstract class ApplicationDatabase : RoomDatabase() {
        abstract fun transferDao(): TransferDao
    
        companion object {
            @Volatile private var instance: ApplicationDatabase? = null
    
            fun getInstance(context: Context): ApplicationDatabase {
                return instance ?: synchronized(this) {
                    instance ?: Room.databaseBuilder(
                        context.applicationContext,
                        ApplicationDatabase::class.java,
                        "transfer_database"
                    ).build().also { instance = it }
                }
            }
        }
    }
    
    • Usa el diseño Singleton para asegurar que solamente una instancia de la base de datos esté abierta a la vez.

Crear una estructura de base de datos robusta en Kotlin con Room no solo es eficiente, sino también esencial para garantizar el rendimiento y la escalabilidad de tu aplicación. A partir de las secciones anteriores, tienes las bases necesarias para continuar expandiendo y mejorando tu aplicación. ¡Sigue explorando y desarrollando!

Aportes 6

Preguntas 0

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

En el mundo real no se recomienda PARA NADA usar el método “allowMainThreadQueries()” al crear la instancia de la base de datos. Ya que las operaciones que realiza el DAO pueden ser muy pesadas para el Main Thread, y esto se ve reflejado en una experiencia de usuario muy mala. Lo recomendable es usar el DAO fuera del Main Thread, haciendo uso de un AsyncTask o mejor aún de una coroutine.

Recordatorio: Singleton es la única instancia para toda la aplicación, se lo puede usar cuando necesitemos una sola instancia, y este podrá ser para múltiples flujos.

Mas información sobre entity aqui
Mas informacion sobre primary key aqui

Entidad

package com.cristianvillamil.platziwallet.ui.transfer.data

import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.PrimaryKey

//definir el esuqema de nuestra tabla

@Entity(tableName = "transfers")
data class TransferEntity (
    @ColumnInfo(name = "transaction_id")
    @PrimaryKey(autoGenerate = true)
    val transactionID : Int = 0,
    @ColumnInfo(name = "user_id")
    val userID : String,
    @ColumnInfo(name = "user_name")
    val userName : String,
    @ColumnInfo(name = "transaction_date")
    val transactionDate : String,
    @ColumnInfo(name = "transaction_amount")
    val transactionAmount : String,
    @ColumnInfo(name = "receiver_user_id")
    val receiverUserId: String
)

DAO

package com.cristianvillamil.platziwallet.ui.transfer.data

import androidx.room.Dao
import androidx.room.Delete
import androidx.room.Insert
import androidx.room.Query

//DAO Data Access Object
//acceder el objeto
//desde aui podemos definir operaciones CRUD(Create Read Update Delete)
//Rom auto genera clases y va a ejecutar estos metodos
@Dao
interface TransfersDAO {
    @Query("SELECT * FROM transfers")
    fun getAll() : List<TransferEntity>
    @Query("SELECT * FROM transfers WHERE user_name LIKE :userName")
    fun findTransferByUserName(userName: String) : List<TransferEntity>
    @Insert
    fun saveTransfer(transfer: TransferEntity)
    @Delete
    fun deleteTransfer(transfer : TransferEntity)
}

He tenido la oportunidad de usar Room en diferentes proyectos, hacerlo con coroutinas es muy genial.

Importante evitar el doble signo de admiración sin realizar una validación previa para evitar el NullpointerException

context?.let { context -> ApplicationDataBase.getAppDataBase(context) }