web-dev-qa-db-fra.com

Interroger la valeur maximale d'une colonne dans SQLite pour Android

J'ai créé et archivé une base de données avec des données. Il y a une colonne où je veux trouver la plus grande valeur.

C'est la méthode utilisée dans mon adaptateur de base de données:

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

Cela devrait fonctionner mais quand j'appelle la méthode:

        cursor = dbadp.getBiggestInTheColumn();

J'obtiens une erreur d'exécution comme celle-ci (LogCat):

07-14 12: 38: 51.852: ERREUR/AndroidRuntime (276): Causé par: Android.database.sqlite.SQLiteException: mauvaise utilisation de la fonction d'agrégation MAX ():, lors de la compilation: SELECT * FROM dépenses WHERE MAX (prix)

Des idées? Je soupçonne que cela est dû à la mauvaise requête, mais c'est le meilleur que je puisse trouver. D'autres requêtes fonctionnent bien.

26
ilcredo

Si vous voulez juste la plus grande valeur, alors vous voulez l'équivalent SQL de: SELECT MAX(price) FROM spendings.

J'ai tendance à utiliser db.rawQuery(String sql, String[] selectionArgs), donc ce serait: db.rawQuery("SELECT MAX(price) FROM spendings", null).

Mais je pense que vous pouvez le faire avec db.query(DATABASE_TABLE, new String [] {"MAX(price)"}, null, null, null, null, null);. Bien que je n'aie pas testé cela.

52
stephendnicholas

Une autre façon d'obtenir la colonne pourrait être de définir la requête au maximum d'une colonne particulière, par exemple:

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

Le curseur qui revient sera la ligne de prix la plus élevée de la base de données.

9
user1060576

veuillez écrire la requête sous la forme select max(price) as price from table name.

le curseur résultant suit l'instruction ci-dessous

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

appelez-le comme:

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

J'ai le même problème sous Android. Et `db.rawQuery (String sql, String [] selectionArgs), ce serait donc: db.rawQuery (" SELECT MAX (prix) FROM dépenses ", null) - throw Exception.

J'ai réparé par:

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

Le curseur qui revient sera la ligne de prix la plus élevée de la base de données. Cela fonctionne correctement.

0
MaksymDovbnia

Si vous souhaitez obtenir la valeur maximale d'une colonne dans une TABLE, vous pouvez utiliser cette méthode

    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;
    }

Si vous souhaitez obtenir l'enregistrement complet contenant la valeur maximale de la colonne

    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;
    }

note: cursorToModel est une méthode pour obtenir la liste des enregistrements dans le curseur satisfaisant à la contrainte

0
Katta Naresh