SQLite:如何获得长类型值的平均值

时间:2012-11-18 13:41:52

标签: android sqlite

我正在创建一个应用程序,记录我的用户触摸屏操作的时间戳。

然后,在SQLite表中记录读数后,我将结束每列的平均值。但是,我收到了一个错误:

E/AndroidRuntime(1344): java.lang.NumberFormatException: Invalid long: "1.40024e+08"

当我尝试取每列的平均值时会发生这种情况,我正在这样做:

public long[] getAvg()
{
    String selectQuery = "SELECT  AVG(dwell_1), AVG(dwell_2), AVG(dwell_3),  AVG(dwell_4), AVG(dwell_5), AVG(dwell_6), AVG(dwell_7), AVG(dwell_8), AVG(dwell_9), AVG(flight_12), AVG(flight_23), AVG(flight_34), AVG(flight_45), AVG(flight_56), AVG(flight_67), AVG(flight_78), AVG(flight_89) FROM " + TABLE;

    SQLiteDatabase db = this.getWritableDatabase();
    Cursor cursor = db.rawQuery(selectQuery, null);

    long[] row = new long[17];

    if (cursor.moveToFirst()) {
        for (int j=0; j<17; j++)
            row[j] =  Long.parseLong(cursor.getString(j));


    }

    return row;

}

它似乎是SQLite查询显示结果的方式的函数。有什么方法可以规避/解决这个问题吗?我顺便要求精度,所以我不能使用int或其他东西。

奇怪的是,当我运行查询直接显示表中的每条记录时,它运行正常。

任何帮助将不胜感激。提前谢谢!

4 个答案:

答案 0 :(得分:3)

我相信SQLite AVG()函数返回一个float值,您试图将其解析为Long,因此是异常。

答案 1 :(得分:1)

试试这个:

 public long[] getAvg()
 {
      String selectQuery = "SELECT  AVG(dwell_1), AVG(dwell_2), AVG(dwell_3),  AVG(dwell_4), AVG(dwell_5), AVG(dwell_6), AVG(dwell_7), AVG(dwell_8), AVG(dwell_9), AVG(flight_12), AVG(flight_23), AVG(flight_34), AVG(flight_45), AVG(flight_56), AVG(flight_67), AVG(flight_78), AVG(flight_89) FROM " + TABLE;

      SQLiteDatabase db = this.getWritableDatabase();
      Cursor cursor = db.rawQuery(selectQuery, null);

      long[] row = new long[17];

      if (cursor.moveToFirst()) {
          for (int j=0; j<17; j++)
               row[j] =  cursor.getLong(j);
      }

      return row;
 }

答案 2 :(得分:1)

SQLite返回浮点结果,您尝试将其保存为long。

可能的解决方案:

  1. 在Java端使用float / double变量。
  2. 或者强制SQLite使用

    输出整数/长整数
    SELECT CAST(avg(field) AS INTEGER) AS avg_field...
    

    在你的情况下,如果原始版本是SQLite INTEGER,结果应该仍然适合Java。

答案 3 :(得分:0)

考虑一种获取实体平均评级的简单方法。评级浮点值存储在0.0到5.0之间。

  public static float getAverageReviews(SQLiteDatabase db) {
        String selectQuery = "SELECT  SUM(stars) * FROM " + DatabaseHelper.TABLE_STORE_REVIEWS;
        Cursor c = db.rawQuery(selectQuery, null);
        int count = c.getCount();
        float totalSum = 0;
        if(count > 0 && c.moveToFirst())
        {
            do {
                String result = c.getString(c.getColumnIndex(StoreReviews.KEY_STARS));
                totalSum  += Float.parseFloat(result);
            } while (c.moveToNext());
        }
        else {
            return 0;
        }
        return totalSum/count;
    }