es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Inyección de Dagger en el Callback de la Habitación – se ha producido un error de inicialización de la propiedad lateinit.

Estoy agregando una RoomDatabase.Callback() para prellenar mi base de datos de room al crearla.

Me encuentro con un problema al inyectar el campo exchangeDao en mi clase. Al ejecutar el código a continuación, obtengo el error: “lateinit property exchangeDao has not been initialized” (“la propiedad exchangeDao aplazada no ha sido inicializada”). Esto a pesar de que se llama en mi línea “exchangeDao.insertExchangeList(equityExchange!!)”.

¿Cómo puedo ejecutar el siguiente código para prellenar la base de datos?

private fun buildDatabase(app: Application) =
    Room.databaseBuilder(
        app,
        AppDatabase::class.java,
        "nombre de tu base de datos"
    )
        .addCallback(PrePopulateDatabase)
        .allowMainThreadQueries()
        .build()

Cita

object PrePopulateDatabase : RoomDatabase.Callback() {

    override fun onCreate(db: SupportSQLiteDatabase) {
        super.onCreate(db)

        CoroutineScope(Dispatchers.IO).launch() {
            val myClass = MyClass()
        }
    }
}

Cita

class MyClass {

    @Inject
    lateinit var exchangeDao: ExchangeDao

    init {
            updateExchangeEntity(exchangeDao)
    }

    companion object {

        private fun updateExchangeEntity(
            exchangeDao: ExchangeDao
        ) {

            var equityExchange: List<exchangeresponse.exchange>? = null

            /////////////////////////////////////////////////////////retrofit object

            val retrofit = Retrofit.Builder()
                .baseUrl("https://api.twelvedata.com/")
                .addConverterFactory(GsonConverterFactory.create())
                .build()
            val myAPICall = retrofit.create(APICall::class.java)

            ///////////////////////////////////////////////////////make call

            val call1 = myAPICall.getEquityInstruments("NASDAQ")
            var response1: Response<exchangeresponse?>? = null
            try {
                response1 = call1!!.execute()
            } catch (e: Exception) {
                e.printStackTrace()
            }
            equityExchange = response1!!.body()!!.data

            exchangeDao.insertExchangeList(equityExchange!!)
        }
    }
}

Dado que no puedo proporcionar el formato de salida en markdown, te he proporcionado la traducción directa al español.</exchangeresponse?></exchangeresponse.exchange>

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema con el código es que el campo exchangeDao en MyClass no está siendo inyectado correctamente, lo que resulta en el error “lateinit property exchangeDao has not been initialized” (la propiedad lateinit exchangeDao no ha sido inicializada). Para solucionarlo, puedes usar Dagger Hilt para inyectar el campo exchangeDao en MyClass.

    Primero, anota MyClass con la anotación @Inject constructor para indicar que debe ser inyectable:

    class MyClass @Inject constructor() {
        ...
    }
    

    Luego, define un Módulo que proporcione la dependencia ExchangeDao:

    @Module
    @InstallIn(ApplicationComponent::class)
    object DatabaseModule {
        @Provides
        fun provideExchangeDao(database: AppDatabase): ExchangeDao {
            return database.exchangeDao()
        }
    }
    

    Finalmente, anota la clase AppDatabase con @HiltAndroidApp para habilitar Hilt en tu aplicación, y agrega la anotación @AndroidEntryPoint a tu clase MainActivity para habilitar la inyección de campos en tu actividad:

    @HiltAndroidApp
    class MyApplication : Application()
    
    @AndroidEntryPoint
    class MainActivity : AppCompatActivity() {
        ...
    }
    

    Con estos cambios, Hilt inyectará automáticamente el campo exchangeDao en MyClass, lo que te permitirá prellenar la base de datos en el método onCreate() de PrePopulateDatabase.

Comments are closed.