我正在创建一个应用程序,记录我的用户触摸屏操作的时间戳。
然后,在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 :(得分: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。
可能的解决方案:
或者强制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;
}