Как получить ID запроса на вставку в комнате db с сопрограммами - PullRequest
3 голосов
/ 07 апреля 2020

Я хочу получить обратный вызов при успешной вставке данных в Roomdb с сопрограммой


MyDao.kt

@Dao
interface MyDao {

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    suspend fun insert(obj: Task): Long
}


TaskViewModel.kt

class TaskViewModel(var context:Context) : ViewModel{
    private var appDao: AppDao

    init {
        val db = AppDatabase.getInstance(context)
        appDao = db.appDao()
    }

    fun insertTask(tast: Task) {
        GlobalScope.launch {
          val mID = appDao.insert(task)
        }
    }
}

Как вернуть mID из insertTask() метода?

Заранее спасибо

1 Ответ

1 голос
/ 07 апреля 2020

Оберните вызов с помощью withContext и пометьте функцию как приостановленную

suspend insertTask(task: Task) = withContext(Dispatchers.IO) { appDao.insertTask(task) }

И, на ваш взгляд:

fun saveTask(t: Task) = lifecycleScope.launch {
    val id = viewModel.insertTask(t)
    Toast.makeText(context, "Task $id has been inserted, Toast.LENGTH_SHORT).show()
}

Вы также можете вернуть LiveData, который вызывает обратный вызов, когда это сделано:

fun insertTask(task: Task): LiveData<Long> {
    val liveData = MutableLiveData<Long>()
    viewModelScope.launch {
        liveData.value = dao.insertTask(task)
    }
    return liveData
}

Дальнейшие рекомендации

Не сохраняйте ссылку на контекст в вашей модели представления. Если вам нужен контекст, используйте AndroidViewModel и AndroidViewModel#getApplication()

...