2012-11-18 58 views
1

我正在制作一个应用程序,记录触摸屏操作使用户的时间戳。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或其他东西。奇怪的是,当我运行查询来直接显示表中的每条记录时,它工作正常。

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

+0

例外是在这里? row [j] = Long.parseLong(cursor.getString(j)); – Simon

+0

你必须写一个浮点值到该列 – Ronnie

回答

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; 
} 
+0

这似乎是工作!谢谢:) – Antimony

3

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

1

的SQLite返回float结果,您要保存到长。

可能的解决方案:在Java方面

  1. 使用float/double变量。
  2. ,或者强制SQLite的输出整数/长使用

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

    在你的情况,因此还是应该适应Java的长,如果原来是SQLite的INTEGER。

+0

它工作,如果我读它作为'cursor.getLong(j)' - 感谢解释,虽然。 +1 – Antimony

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; 
    }