在SQLite For Android中查询列的最大值

时间:2011-07-14 12:52:59

标签: android sqlite

我创建了一个数据库,并提交了数据。有一栏我想找到最大的价值。

这是我的数据库适配器中使用的方法:

public Cursor getBiggestInTheColumn() {
    return db.query(DATABASE_TABLE, null,
                    "MAX(price)", null, null, null, null);
}

它应该可以工作,但是当我调用方法时:

        cursor = dbadp.getBiggestInTheColumn();

我得到像这样的运行时错误(LogCat):

  

07-14 12:38:51.852:ERROR / AndroidRuntime(276):引起:android.database.sqlite.SQLiteException:滥用聚合函数MAX():,同时编译:SELECT * FROM花费WHERE MAX(价格) )

有什么想法吗?我怀疑这是由于查询错误,但这是我能想到的最好的。其他查询效果很好。

7 个答案:

答案 0 :(得分:52)

如果您只想要最大值,那么您希望SQL等效于: SELECT MAX(price) FROM spendings

我倾向于使用db.rawQuery(String sql, String[] selectionArgs),因此它会是:db.rawQuery("SELECT MAX(price) FROM spendings", null)

但我认为你可以用db.query(DATABASE_TABLE, new String [] {"MAX(price)"}, null, null, null, null, null);做到这一点。虽然我没有测试过。

答案 1 :(得分:9)

获取列的另一种方法是将查询设置为特定列的最大值,例如:

db.query(DATABASE_TABLE, null, "price=(SELECT MAX(price))", null, null, null, null)

返回的游标将是数据库中的最高价格行。

答案 2 :(得分:7)

请将查询写为select max(price) as price from table name

结果光标遵循以下声明

cursor.getString(cursor.getColumnIndex("price"));

答案 3 :(得分:3)

 public Cursor select(String sql)
{
    try
    {
        Cursor cursor = mDataBase.rawQuery(sql,null);
        return cursor;
    }
    catch (SQLException mSQLException)
    {
        throw mSQLException;
    }
}
and 

称之为:

 Cursor cursor = dal.select("SELECT Max(id) FROM terms"); //where en like '"+name+"%'");
if (cursor != null) {
    cursor.moveToFirst();
   int id= cursor.getInt(0);}

答案 4 :(得分:0)

我在Android中遇到同样的问题。 和`db.rawQuery(String sql,String [] selectionArgs),所以它将是:db.rawQuery(“SELECT MAX(price)FROM spendings”,null) - 抛出异常

我修复:

db.query(DATABASE_TABLE, null, "price=(SELECT MAX(price) FROM + DATABASE_TABLE + ")", null, null, null, null)

返回的游标将是数据库中的最高价格行。它的工作正确。

答案 5 :(得分:0)

如果要获取TABLE中列的最大值,可以使用此方法

    public String getMax( String TABLE_NAME, String column_name) {// use the data type of the column
            database.open();
            Cursor cursor = database.query(TABLE_NAME, new String[]{"MAX(" +column_name + ") AS MAX"}, null, null, null, null, null);
            cursor.moveToFirst(); // to move the cursor to first record
            int index = cursor.getColumnIndex("MAX");
            String data = cursor.getString(index);// use the data type of the column or use String itself you can parse it 
            database.close();
            return data;
    }

如果您想获得包含列

的最大值的整个记录
    public List<Object> getMaxRecord(String TABLE_NAME, String column_name) {
            database.open();
            Cursor cursor = database.query(TABLE_NAME, new String[]{"*"}, column_name + " = " + "(SELECT MAX(" + column_name + ") FROM " + TABLE_NAME + ")", null, null, null, null);
            List<Object> demos = cursorToModel(cursor);
            database.close();
            return demos;
    }

注意:cursorToModel是一种获取光标中记录约束的记录列表的方法

答案 6 :(得分:0)

如果您只想要最大的INTEGER值,则可以使用以下内容:

public int getBiggestInTheColumn() {
    return (int) DatabaseUtils.longForQuery(db, "SELECT MAX(price) FROM " + DATABASE_TABLE, null);
}

DatabaseUtils已添加到Android API 1

public static long longForQuery(SQLiteDatabase db, 字符串查询 String [] selectionArgs)

实用程序方法,用于在数据库上运行查询并在第一行的第一列中返回值。

Android Developers > DatabaseUtils