1

我正在制作一个记录触摸屏操作时间戳的应用程序,这让我成为了我的用户。

然后,在 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

4 回答 4

3

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

于 2012-11-18T13:52:15.570 回答
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;
 }
于 2012-11-18T13:56:19.983 回答
1

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

可能的解决方案:

  1. 在 Java 端使用浮点/双精度变量。
  2. 或者使用强制 SQLite 输出整数/长整数

    SELECT CAST(avg(field) AS INTEGER) AS avg_field...
    

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

于 2012-11-18T14:00:13.717 回答
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;
    }
于 2016-09-28T20:33:39.857 回答