How to get ID of insert query in Room db with coroutines

Viewed 1690

I want to get callback when insert data successfully in Roomdb with coroutine


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

How to return mID from insertTask() method ?

Thanks you in advance

1 Answers

Wrap the call with the withContext and mark the function as suspend

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

And from your view:

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

You could also return a LiveData that triggers a callback when it's done:

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

Further advice

Don't keep a reference to a context in your viewmodel. If you need the context use AndroidViewModel and AndroidViewModel#getApplication()

Related