Android 如何在房间数据库中求和

Android 如何在房间数据库中求和,android,mysql,kotlin,android-room,Android,Mysql,Kotlin,Android Room,我想知道如何在房间数据库中求和 假设我在房间数据库中插入了这个值(10000),我想在数据库中插入新值(20000),我希望新值与旧值求和,而不是替换它 我该怎么做 代码示例: 数据库表: @entity class sum ( id : int , value : Long ) Dao : @insert (onConflict = OnConflictStrategy.REPLACE) suspend fun insert (model :sum) what shoud i us

我想知道如何在房间数据库中求和

假设我在房间数据库中插入了这个值(10000),我想在数据库中插入新值(20000),我希望新值与旧值求和,而不是替换它

我该怎么做

代码示例:

数据库表:

@entity 
class sum (

id : int , 
value : Long )

Dao :

@insert (onConflict = OnConflictStrategy.REPLACE)
suspend fun insert (model :sum)

what shoud i use instead of above insert . 


@Query("SELECT * FROM sum")

fun getall () : LiveData<sum>


感谢各位关注我的代码并帮助我。

在Dao中,我看到您使用了函数getAll(), 假设您将它们保存到整数列表中

val list: List<Int>//list holding all of you data returned in the onChanged method of the observer callback(or the lambda callback in case of Kotlin)
调用update函数时,将我前面提到的“list”中的旧值和newValue的总和传递给它

database.dao.update(list[1] + newValue)

尝试在dao中添加下一个方法:

@Query("UPDATE sum SET value = value + :addValue WHERE id =:id")
suspend fun updateSum(id: Int, addValue: Long)
然后可以从ViewModel/Activity调用它

更新

对于更新/插入的单个方法,请将这些方法放在dao中:

@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertSum(model: Sum)

@Query("UPDATE sum SET value = value + :value WHERE id = :id")
suspend fun updateSum(id: Int, value: Long)

@Query("SELECT * FROM sum WHERE id = :id")
suspend fun getSumById(id: Int): Sum?

@Transaction
suspend fun updateOrInsertSum(sum: Sum) { // <-- this method updates value or insert new item, if id is not found
    getSumById(sum.id)?.let { updateSum(sum.id, sum.value) } ?: insertSum(sum)
}
在下一次调用时,将使用相同的方法更新项目:

viewmodel.updateOrInsertSum(Sum(1 ,20000)) // <-- id = 1, value = 10000+2000 

viewmodel.updateOrInsertSum(Sum(12000))//我正在使用上面的代码,但没有在数据库中插入任何内容。为什么?````@Entity(tableName=“credit”)数据类credit(@PrimaryKey val-id:Int?,var-credittext:Long)````@Query(“UPDATE-credit-SET-credittext=credittext+:addValue-WHERE-id=:id=:id”)挂起乐趣更新Sum(id:Int,addValue:Long)```
suspend-fun-update(id:Int,addValue:Long)=db.GetDao().updateSum(id,addValue)
``fun-getallcredit()=db.GetDao().creditall()```
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertSum(model: Sum)

@Query("UPDATE sum SET value = value + :value WHERE id = :id")
suspend fun updateSum(id: Int, value: Long)

@Query("SELECT * FROM sum WHERE id = :id")
suspend fun getSumById(id: Int): Sum?

@Transaction
suspend fun updateOrInsertSum(sum: Sum) { // <-- this method updates value or insert new item, if id is not found
    getSumById(sum.id)?.let { updateSum(sum.id, sum.value) } ?: insertSum(sum)
}
viewmodel.updateOrInsertSum(Sum(1 ,10000)) // <-- id = 1, value = 10000
viewmodel.updateOrInsertSum(Sum(1 ,20000)) // <-- id = 1, value = 10000+2000