Обновление пользователя в комнате с помощью WorkManager - PullRequest
0 голосов
/ 25 января 2019

Я пытаюсь использовать WorkManager в Android, потому что до сих пор я делал обновления вставки, используя AsyncTask. Я пытаюсь обновить пользователя в Room database. Я создал класс в Repository, чтобы выполнить процесс в фоновом режиме, но я не знаю, является ли это правильным способом кодирования. Также я немного запутался, как вызывать метод в userViewModel.

Вот мой код:

В репозитории:

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()
    }
}

И в viewModel:

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

}

Возможно, это неправильный способ использования WorkManager, поэтому я был бы признателен, если бы кто-нибудь мог мне помочь.

1 Ответ

0 голосов
/ 26 января 2019

Вы можете использовать свой код с небольшими изменениями. Вы можете передать свои параметры, такие как 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()
    }
}
...