2012-09-19 151 views
1

我在與下面的代碼SELECT語句(這是我的數據庫輔助類)的問題:SELECT語句不返回MAX數

public Cursor selectMaxAreaNumber (long inspectionId) { 
String inspectionIdString = String.valueOf(inspectionId); 
String[] tableColumns = new String[] { 
     AREA_NUMBER, 
     "(SELECT max(" + AREA_NUMBER + ") FROM " + AREAS_TABLE + ") AS max" 
    }; 
String whereClause = INSPECTION_LINK + " = ?"; 
String[] whereArgs = new String[] { 
     inspectionIdString   
    }; 
Cursor c = rmDb.query(AREAS_TABLE, tableColumns, whereClause, whereArgs, 
     null, null, null); 


if (c != null) { 
    c.moveToFirst(); 
} 
c.close(); 
return c; 

}

我再調用這個我的活動如下:

Cursor c = rmDbHelper.selectMaxAreaNumber(inspectionId); 
    startManagingCursor(c); 
    c.moveToFirst(); 
    nextAreaNumber = c.getInt(c.getColumnIndex("max")) + 1; 

它拉從表中的最大數量,所以它似乎是WHERE語句失敗。但是,我看不出問題是什麼。

作爲這個問題的一部分,任何人都可以確認,如果我通過在查詢中使用ID轉換爲字符串做正確的事情,我是否需要在兩個位寫入c.moveToFirst()?

非常感謝提前!

+0

嵌套的'SELECT'語句之前執行的'WHERE'子句應用。所以它按預期工作,雖然不符合你的意願:) – zapl

回答

1

試試這個:

public Cursor selectMaxAreaNumber (long inspectionId) { 
    String[] tableColumns = new String[] { 
     "Max(" + AREA_NUMBER + ") AS max" 
    }; 
    String whereClause = INSPECTION_LINK + " = ?"; 
    String[] whereArgs = new String[] { 
     String.valueOf(inspectionId); 
    }; 
    return rmDb.query(AREAS_TABLE, tableColumns, whereClause, whereArgs, 
     null, null, null); 
} 

這將返回遊標最大的AREA_NUMBER有適當的inspectionId

一對夫婦的注意事項:

  • 當你使用像Max()的功能,你只能得到一個行作爲一個結果,沒有必要要求AREA_NUMBERSMax(AREA_NUMBERS)
  • A光標可能是,但它不會是null
  • 在使用之前不要關閉光標

所以你不需要這樣的:

if (c != null) { 
    c.moveToFirst(); 
} 
c.close(); 

明白,如果c某種程度上是null,你仍然會收到上一個NullPointerException c.close()


(可選)您可以刪除whereArgs和只需使用:

String whereClause = INSPECTION_LINK + " = " + inspectionId; 

(僅因爲inspectionIdlong數據類型,您需要一個字符串來執行注入攻擊。)


最後,你應該檢查這裏的空光標:

Cursor c = rmDbHelper.selectMaxAreaNumber(inspectionId); 
startManagingCursor(c); 
if(c.moveToFirst()) 
    nextAreaNumber = c.getInt(c.getColumnIndex("max")) + 1; 
else //empty Cursor, return a default value 
    nextAreaNumber = 0; 
+0

我給了兩個勾號,但這個解決方案是完美的。感謝您的額外信息。我已經從數據庫幫助程序類中刪除了cursor.close()語句,但是我已經假定我應該關閉一次用於其他活動的遊標(遊標管理非常混亂!!)。乾杯山姆。 – Scamparelli

+0

「(遊標管理非常混亂!!)」是的,可以。使用'getInt()','getString()'等完成數據讀取後,關閉你的Cursor。但是由於你正在使用'startManagingCursor()',這將關閉你的Cursor! – Sam

1

嘗試改變

「(SELECT MAX(」 + AREA_NUMBER + 「)FROM」 + AREAS_TABLE + 「)作爲最大」

「SELECT MAX(」 + AREA_NUMBER +「) AS馬克斯「+ AREAS_TABLE

+0

啊,只是意識到我不能給兩個蜱!我已經把它交給了Sam,因爲他的回答非常詳細,但是感謝Rainwork的迴應。非常感激。 – Scamparelli