【问题标题】:Trying to get sum from Room database column试图从 Room 数据库列中获取总和
【发布时间】:2020-07-01 08:39:54
【问题描述】:

这是我在这里的第一个问题,我是编码初学者,如果我的问题不是很清楚,请原谅我。

我已将工资存储在名为“工资”的 Room 数据库列中,数据类型为 double。有不同日子的工资,我想在我的活动中显示这些双倍数字的总数。如果尝试了许多不同的方法来做到这一点,但我无法让它在没有不同错误的情况下工作。

如果我可以将该总和存储到一个变量中,这样我就可以轻松地使用它,并且可能会在必要时从中减去一些值。

我使用 Repository 和 ViewModel 来访问我的数据库,并使用 RecyclerView、Adapter 和 CardView 在我的 MainActivity 中显示不同的数据。我希望我不需要使用这些来访问这个总和数,而是尽可能直接地访问它。

这是我的@entity

@Entity (tableName = "shift_table")
public class Shift implements Serializable {


@PrimaryKey(autoGenerate = true)
private int id;

@ColumnInfo(name = "date")
private String date;

@ColumnInfo(name = "start")
private String start;

@ColumnInfo(name = "end")
private String end;

@ColumnInfo (name = "hours")
private String hours;

@ColumnInfo (name = "wage")
private double wage;

public Shift(String date, String start, String end, String hours, double wage) {
    this.date = date;
    this.start = start;
    this.end = end;
    this.hours = hours;
    this.wage = wage;
}

public void setId(int id) {
    this.id = id;
}

public int getId() {
    return id;
}

public String getDate() {
    return date;
}

public String getStart() {
    return start;
}

public String getEnd() {
    return end;
}

public String getHours() {
    return hours;
}

public double getWage() {
    return wage;
}

}

这是我的@Dao

@Dao
public interface ShiftDao {

@Insert
void insert (Shift shift);

@Update
void update (Shift shift);

@Delete
void delete (Shift shift);

@Query("DELETE FROM shift_table")
void deleteAllShifts();

@Query("SELECT * FROM shift_table ORDER BY id DESC")
LiveData<List<Shift>> getAllShifts();

@Query("SELECT SUM(wage) FROM shift_table")
What here? 
}

如何将 SUM 从工资列获取到变量并在 TextView 中显示?

【问题讨论】:

  • LiveData&lt;Long&gt; getSum();
  • @uneq95 对于 double 类型的列值,我们无法正确存储在 Long 类型中。

标签: java android android-room


【解决方案1】:

您可以像下面的示例一样获得双列的总和。双列值的总和将存储在BigDecimal 中。更多详情可以查看documentation

@Query("SELECT SUM(column) FROM table")
LiveData<BigDecimal> getSum();

【讨论】:

    【解决方案2】:

    这是我的一些 kotlin 代码,喜欢:)

    @Query("SELECT SUM(column) FROM table")
    fun getSum(): Int
    

    存储库

    private val mDao: Dao
    
    init {
        val database = getInstance(mApplication)    
        mDao = database.dao()
    }
    
    
    private class sumAsyncTask(private val mDao: Dao) : AsyncTask<Void, Void, Int>() {
        protected override fun doInBackground(vararg voids: Void): Int {
            return mDao.getSum()
        }
    
    }
    
    fun getSum(): Int {
        return sumAsyncTask(mDao).execute().get()
    }
    

    可能还有其他方法可以做到这一点,这就是我使用的。

    PS:至于 Doubles,您可能希望将它们存储为 Long / SQL Integer(参见 Create Room Entity for a Table which has a field with LONG datatype in Sqlite) 这可以通过在存储到数据库之前简单地乘以 100(如果你的工资代表金钱,那么你就有美分)来完成

    【讨论】:

    • 谢谢您的回答!我无法让它工作。当我尝试在我的活动中访问此 getSum() 方法并将结果获取到变量时,我收到此错误:“尝试在空对象引用上调用虚拟方法”。您如何从查询中获取此总和值到活动中的变量或 TextView?
    • 这可能是您的存储库实例的问题,这是一个很棒的教程系列,教如何连接所有点(Room-Repository-ViewModel)youtube.com/watch?v=ARpn-1FPNE4
    【解决方案3】:

    在你的 DAO 中应该是这样的:

    @Query("SELECT SUM(" + "wage" + ") as wagesSum "+ " FROM " + "shift_table")
    double getWageSum();
    

    现在,有几点建议:

    1. 将列名放入最终常量中,如下所示:

      公共最终字符串 COLUMN_DATE_NAME = "日期"; @ColumnInfo(name = COLUMN_DATE_NAME) 私有字符串日期;

    这样,您可以更轻松地在 DAO 中静态访问常量,并且如果将来您可能想要更改该列的名称,您只需在常量中进行更改。另外,请对表名执行相同的操作。当您编写未来可能的迁移时,这些常量也会为您提供帮助。

    编码愉快!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-04
      • 1970-01-01
      • 2019-01-22
      • 1970-01-01
      • 2018-06-27
      • 1970-01-01
      • 2019-12-30
      • 1970-01-01
      相关资源
      最近更新 更多