Вы можете использовать свой код с небольшими изменениями. Вы можете передать свои параметры, такие как userId, userName и т. Д., В WorkManager
, используя класс Data
. Также нет необходимости делать класс Worker
внутренним классом. Просто сделайте его независимым классом. Так что, в принципе, ваш worker
класс будет выглядеть примерно так:
TestWorker.kt
class TestWorker(ctx: Context, params: WorkerParameters) : Worker(ctx, params) {
override 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())
}
}
Не забудьте сделать вашу базу данных синглтоном так:
@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()
}
}