2011-07-14 61 views
23

我有一個數據庫創建並歸檔數據。有一列我想找到最大的價值。查詢SQLite中的列的最大值對於Android

這是我的數據庫適配器使用的方法:

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():,wh ile編譯:選擇*從花費哪裏最大(價格)

任何想法?我懷疑這是由於糟糕的查詢,但這是我能想到的最好的。其他查詢運作良好。

回答

49

如果你只是想要最大的價值,那麼你想要SQL的等價物: SELECT MAX(price) FROM spendings

我傾向於使用db.rawQuery(String sql, String[] selectionArgs),所以它會是:db.rawQuery("SELECT MAX(price) FROM spendings", null)

但我認爲你可以用​​做到這一點。雖然我沒有測試過。

+0

我試過了'db.rawQuery(「SELECT MAX(price)FROM spendings」,null)',但它只是將錯誤更改爲:錯誤/ AndroidRuntime(335):引起:android.database.CursorIndexOutOfBoundsException:索引-1請求,大小爲1.雖然我覺得是正確的路要走。需要檢查rawQuery方法。 – ilcredo

+6

當您嘗試使用光標獲取數據時,是否收到該異常?如果是這樣,這聽起來像你需要將光標放在第一行,然後才能從中獲取數據。要做到這一點,你可以調用:'mCursor.moveToFirst()'。此外,此方法調用返回一個布爾值,如果沒有結果,則該值爲false;所以你也可以用它來防範這種情況。 – stephendnicholas

+7

這個評論在兩個小時的嘗試後解決了我的問題。在使用它之前將遊標移到第一個記錄。人們總是忘記這一點。 –

8

另一種方式來獲得柱可能是查詢設置爲一個特定列的最大值,例如:

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

返回將在數據庫中的最高價行光標。

+0

SQLiteException:濫用聚合:MAX()(代碼1) –

6

請將查詢條件寫爲select max(price) as price from table name

導致光標按照下面的語句

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

我不得不添加cursor.moveToFirst();在獲得實際價值以使其工作之前 – Defuera

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) 

返回將在數據庫中的最高價行光標。它工作正確。

2
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);} 
+0

select方法在另一個類「DAL」中並從DAL創建對象「dal」 –

0

如果你想在一個表中的列的最大值。如果你想獲得整個記錄您可以使用此方法

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是一種方法來獲取光標中的記錄清單約束