Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

392
Visualizações
Update database entry in Room using WorkManager

I am trying to use WorkManager in Android because till now I have done my insert updates using AsyncTask. I'm trying to update user in Room database. I have created a class in Repository to do the process in background but I don't know if this is the right way to code. Also I am a bit confused how to call the method in userViewModel.

Here is my code:

In Repository:

inner class Test(ctx: Context, params: WorkerParameters) : Worker(ctx, params) {

    override fun doWork(): Result {
        fun updateUser(userId : Int , userName :String , userLastname: String){
            userDao.updateUser(userId, userName, userLastname)
        }
        return Result.success()
    }
}

And in viewModel:

private val workManager: WorkManager = WorkManager.getInstance()
fun updateUser(userID: Int, userName: String, userLastname: String)    {
    workManager.enqueue(OneTimeWorkRequest.from(Repository.Test::class.java))

}

Maybe this is not the right way to use WorkManager so I would appreciate it if anyone can help me.

over 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

Updated to support Coroutine Worker

You can use your code with minor changes. You can pass your parameters like userId, userName etc to WorkManager using Data class. Also there is no need to make the Worker class an inner class. Just make it an independent class.So basically, you worker class would look something like:

TestWorker.kt

class TestWorker(ctx: Context, params: WorkerParameters) : CoroutineWorker(ctx, params) {

    override suspend fun doWork(): Result {
        val userId = inputData.getInt("USER_ID")
        val userName = inputData.getString("USER_NAME")
        val userLastname = inputData.getString("USER_LAST_NAME") 
        AppDatabase.getInstance().userDao.updateUser(userId, userName, userLastname)
        return Result.success()
    }
}

TestViewModel.kt

class TestViewModel : ViewModel() {
    fun updateUser(userId: Int, userName: String, userLastName: String) {
        val worker = OneTimeWorkRequest.Builder(TestWorker::class.java)
        val data = Data.Builder()
        //Add parameter in Data class. just like bundle. You can also add Boolean and Number in parameter.
        data.putInt("USER_ID", userId)
        data.putString("USER_NAME", userName)
        data.putString("USER_LAST_NAME", userLastName)
        //Set Input Data
        worker.setInputData(data.build())
        //enque worker
        WorkManager.getInstance().enqueue(worker.build())
    }
}

Don't forget to make your database singleton like this:

@Database(entities = [User::class],
    version = 1,
    exportSchema = false)
abstract class AppDatabase : RoomDatabase() {

    abstract fun userDao(): UserDao

    companion object {

        // For Singleton instantiation
        @Volatile
        private var instance: AppDatabase? = null

        fun getInstance(context: Context): AppDatabase {
            return instance ?: synchronized(this) {
                instance ?: buildDatabase(context).also { instance = it }
            }
        }

        private fun buildDatabase(context: Context) =
            Room.databaseBuilder(context, AppDatabase::class.java, "userdb")
                .build()
    }
}
over 4 years ago · Santiago Trujillo Relatório

0

For those of you got error make doWork suspend, you can snippet following answer below.

class TestWorker(ctx: Context, params: WorkerParameters) : CoroutineWorker(ctx, params) {
    val context = ctx
    
    override suspend fun doWork(): Result {
        val userId = inputData.getInt("USER_ID")
        val userName = inputData.getString("USER_NAME")
        val userLastname = inputData.getString("USER_LAST_NAME") 
        AppDatabase.getInstance(context).userDao.updateUser(userId, userName, userLastname)
        return Result.success()
    }
}

detail changes:

Worker CoroutineWorker

override suspend fun doWork(): Result

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda