如何通过SQLite操作存储计算?

时间:2016-09-20 04:48:52

标签: java android sqlite

我试图获取SQLite表中一列数据的平均值。该列称为数字。所以我写了下面的代码:

private findMaxNumber(){
        db.execSQL("select avg(number) from table");        
}

但我不明白这会产生什么。存储的数字是什么类型的格式?

我宣布了

private int average

我希望将平均值设置为等于数据库中计算的值。

我该怎么做?

我试过

private findMaxNumber(){
        average = db.execSQL("select avg(number) from table"); 

}

但这并没有奏效。它说"整数"和"无效"是不相容的。我认为这意味着我的SQLite代码没有产生任何结果。但他们在这里说SQLite - how to get average value?这是找到平均值的合适的SQLite代码,所以我很困惑发生了什么。

更新:

protected void createDatabase(){
            db= openOrCreateDatabase("NuPersonDB", Context.MODE_PRIVATE, null);
            db.execSQL("CREATE TABLE IF NOT EXISTS persons(id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, name VARCHAR,address VARCHAR, date TEXT,number INTEGER);");
        }

4 个答案:

答案 0 :(得分:1)

当您使用Android SQLite时,它不会直接从执行查询中获得结果,它将返回您需要获取值的Cursor,请在下面查看。

  private int findMaxNumber()
  {
      int average = 0;
      String selectQuery = "select avg(number) from table";

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

      if(cursor.moveToFirst())
      {
          average = cursor.getInt(0);
      }

      return average;
  }

答案 1 :(得分:0)

execSQL()不会返回数据。 要从数据库中获取实际值,您必须改为使用rawQuery(),这将返回Cursor个对象。

从游标中读取单个值需要额外的moveToFirst()getXxx()次调用。这种情况经常发生,因为它有helper function

average = (int)DatabaseUtils.longForQuery(db, "select avg(number) from table", null); 

答案 2 :(得分:-1)

这是因为SQL操作总是检索ResultSet,除非在存储过程中指定。

这里试试这个:

       import java.sql.Connection;
       import java.sql.PreparedStatement;
       import java.sql.ResultSet;
       import java.sql.SQLException;
       import java.sql.Statement;

       .....

        // Your connection parameter
        Connection con = ds.getConnection();
        conn = ds.getConnection(con);

        Statement stmt = conn.createStatement();                
        String sql = "Select avg(number) from table";
        ResultSet rs = stmt.executeQuery(sql);

        if(rs.next()){
          int average = rs.getInt(0);
        }

答案 3 :(得分:-1)

您需要执行如下操作。任何列的平均值都是浮点值。所以我们声明了浮点值并使用游标对象获取所选值。如果要打开数据库,请使用以下方法。

private float findMaxNumber(){
        String sql = "select avg(number) from table";
        float average = 0;
        Cursor cursor;
        try {
            openDataBase();
            cursor = db.rawQuery(sql, null);
            while (cursor.moveToNext()) {
                average = cursor.getFloat(0);
            }

        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return average;

    }

    public static synchronized SQLiteDatabase openDataBase() throws SQLException {

        // Open the database
        // String myPath = DB_PATH + DB_NAME;

        if (db == null) {
            db = SQLiteDatabase.openDatabase(DB_PATH + DB_NAME, null,SQLiteDatabase.OPEN_READWRITE|  SQLiteDatabase.NO_LOCALIZED_COLLATORS);

        } else if (!db.isOpen()) {
            db = SQLiteDatabase.openDatabase(DB_PATH + DB_NAME, null,SQLiteDatabase.OPEN_READWRITE|  SQLiteDatabase.NO_LOCALIZED_COLLATORS);

        }
        return db;
    }