【问题标题】:Query a single column from Room database and calculate the sum从 Room 数据库中查询单列并计算总和
【发布时间】:2021-06-20 05:57:18
【问题描述】:

我想查询我的数据库,从一列中获取所有数据。

此信息是一个字符串,例如“19,96 €”(如果需要,我当然可以删除 €)

我需要一个函数来将此列的数据转换为双精度并返回总和以供我在另一个视图中显示。 我想我已经有查询了,但我不确定。

我现在该怎么做?如何将列变成双精度并从中获取总和?

这是项目类:

 @Entity(tableName = "receipt_table")
 @Parcelize
 data class Receipts(
@ColumnInfo(name = "total") var total: String,
@ColumnInfo(name = "date") var date: String,
@ColumnInfo(name = "store") var store: String,
@PrimaryKey(autoGenerate = true) val id: Int= 0) : Parcelable

还有道:

@Dao
interface ReceiptDao {

    @Query("SELECT * FROM receipt_table")
    fun getAllReceipts(): Flow<List<Receipts>>

    @Query("SELECT total FROM receipt_table")
    fun getAllReceiptsTotal(): Flow<List<Int>>

    ///@Query("SELECT date FROM receipt_table")
    ///fun getDate(): Flow<List<Receipts>>


    @Insert(onConflict = OnConflictStrategy.REPLACE)
    suspend fun insert(receipts: Receipts)

    @Update
    suspend fun update(receipts: Receipts)

    @Delete
    suspend fun delete(receipts: Receipts)
}

【问题讨论】:

    标签: android kotlin android-room


    【解决方案1】:

    执行您想要的查询是这样的:

    SELECT SUM(REPLACE(total, ',', '.')) AS sum_total 
    FROM receipt_table
    

    货币后缀没有问题,但小数点分隔符,是,REPLACE()改为.
    然后 SQLite 将列的值隐式转换为数值以执行聚合。

    查看简化的demo

    请注意,最好将数值存储为数字而不是字符串。

    【讨论】:

    • 非常感谢!所以我将使用的代码是:@Query("SELECT SUM(REPLACE(total, ',', '.')) AS sum_total FROM receipt_table") ?
    • @dkiwikid 是的,就像任何其他查询一样。
    • 好吧,第一次使用数据库之类的东西,很抱歉这些问题。在我的程序中其他地方访问它的功能保持不变对吗? fun getAllReceiptsTotal(): Flow> 或者我如何访问刚刚查询的数据?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-01
    • 1970-01-01
    相关资源
    最近更新 更多