Kotlin 房间数据库布尔值
Kotlin room database boolean
我正在尝试创建一个应用程序,用户可以在其中列出要实现的步骤目标列表,然后选择其中一个来激活并遵循。当我只使用目标 ID、名称和步骤时数据库可以工作,但现在我意识到我需要插入另一列来定义目标何时处于活动状态,所以我试图插入它,但我不知道我应该如何处理布尔值,尤其是在存储库和 viewModel 中。我将不胜感激任何帮助。提前致谢
这是我的代码
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)
}
只需将新的 属性 添加到 Goal
class 之类的 isActive: Boolean
,然后在 Room 中使用 @Update
注释(您已经实现了在你的 Dao 的 updateGoal(goal: Goal)
方法中)或 UPDATE
在 SQLite 中命令自己更新你想要更改其 isActive
状态的行。要使用 SQLite,请执行以下操作:
@Query("UPDATE user_goal_table SET isActive = 1 WHERE goalId = :goalId")
suspend fun makeGoalActive(goalId: Int)
对于布尔属性,在 SQLite 命令中对 true
使用 1
,对 false
使用 0
。
在Repository中,这个方法就够了:
suspend fun active(goalId: Int) {
dao.makeGoalActive(int)
}
在 ViewModel 中:
fun insert(goal: Goal) = viewModelScope.launch {
repository.insert(goal)
}
顺便说一句,您不需要为 Room 方法确定 IO
调度程序,Room 使用自己的调度程序来 运行 查询。
我正在尝试创建一个应用程序,用户可以在其中列出要实现的步骤目标列表,然后选择其中一个来激活并遵循。当我只使用目标 ID、名称和步骤时数据库可以工作,但现在我意识到我需要插入另一列来定义目标何时处于活动状态,所以我试图插入它,但我不知道我应该如何处理布尔值,尤其是在存储库和 viewModel 中。我将不胜感激任何帮助。提前致谢
这是我的代码
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)
}
只需将新的 属性 添加到 Goal
class 之类的 isActive: Boolean
,然后在 Room 中使用 @Update
注释(您已经实现了在你的 Dao 的 updateGoal(goal: Goal)
方法中)或 UPDATE
在 SQLite 中命令自己更新你想要更改其 isActive
状态的行。要使用 SQLite,请执行以下操作:
@Query("UPDATE user_goal_table SET isActive = 1 WHERE goalId = :goalId")
suspend fun makeGoalActive(goalId: Int)
对于布尔属性,在 SQLite 命令中对 true
使用 1
,对 false
使用 0
。
在Repository中,这个方法就够了:
suspend fun active(goalId: Int) {
dao.makeGoalActive(int)
}
在 ViewModel 中:
fun insert(goal: Goal) = viewModelScope.launch {
repository.insert(goal)
}
顺便说一句,您不需要为 Room 方法确定 IO
调度程序,Room 使用自己的调度程序来 运行 查询。