我试图获取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);");
}
答案 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;
}