Home > Net >  Kotlin room database boolean
Kotlin room database boolean

Time:03-11

Im trying to create an app where a user can has a list of goals of steps to reach they create and then choose one of them to be active and to follow. The database works when I was just using the goal id, name, and steps but now I realised I need to insert another column defining when a goal is active so Im trying to insert that, however I don't know how I should handle the boolean especially in the repository and viewModel. I'd appreciate any help. Thanks in advance

here's my code

interface Dao {

@Insert(onConflict = OnConflictStrategy.IGNORE)
suspend fun insert(goal: Goal)

@Update
suspend fun updateGoal(goal: Goal)

@Query("SELECT * FROM user_goal_table order by goalId")
fun getAll(): LiveData<List<Goal>>


@Query("SELECT * FROM user_goal_table WHERE goalId = :key")
suspend fun getGoal(key: Int): Goal

@Delete
suspend fun delete(goal: Goal)

@Query("SELECT * FROM user_goal_table WHERE goal_is_active = 1 order by goalId")
suspend fun makeGoalActive(key: Int): Goal




class Repository (private val dao : Dao){

val allGoals: LiveData<List<Goal>> = Dao.getAll()

suspend fun insert(goal: Goal){
    dao.insert(goal)
}

suspend fun update(goal: Goal){
    dao.update(goal)
}

suspend fun delete(goal: Goal){
    dao.delete(goal)
}

suspend fun active(goal: Goal, int: Int){
    dao.makeGoalActive(int)
}



class ViewModel (application: Application) : AndroidViewModel(application) {

val allGoals: LiveData<List<Goal>>
private val repository: Repository

init{
    val dao = GoalDatabase.getInstance(application).getGoalDao()
    repo = Repository(dao)
    allGoals = repository.allGoals

}


fun insert(goal: Goal) = viewModelScope.launch(Dispatchers.IO){
    repository.insert(goal)
}

fun update(goal: Goal) = viewModelScope.launch(Dispatchers.IO){
    repository.update(goal)
}

fun delete(goal: Goal) = viewModelScope.launch(Dispatchers.IO){
    repository.delete(goal)
}

CodePudding user response:

Just add a new property like isActive: Boolean to your Goal class and then use @Update annotation in Room (that you've already implemented in updateGoal(goal: Goal) method of your Dao) or UPDATE command itself in SQLite to update the row you want to change its isActive state. For using SQLite do something like below:

@Query("UPDATE user_goal_table SET isActive = 1 WHERE goalId = :goalId")
suspend fun makeGoalActive(goalId: Int)

For boolean properties, use 1 for true and 0 for false in SQLite commands.

In Repository, this method is enough:

suspend fun active(goalId: Int) {
    dao.makeGoalActive(int)
}

And in the ViewModel:

fun insert(goal: Goal) = viewModelScope.launch {
    repository.insert(goal)
}

Btw, you don't need to determine IO dispatcher for Room methods, Room uses its own dispatcher to run queries.

  • Related