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

AVG ()関数は、解析しようとしている値をSQLite返すと思います。したがって、例外です。floatLong

于 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はfloatの結果を返しますが、これは長く保存しようとしています。

可能な解決策:

  1. Java側でfloat/double変数を使用します。
  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 に答える