2012-07-14 24 views
5

我正在爲android開發我的冷杉應用程序,我正在使用多個表來獲取和插入數據。在開發過程中,發現自己從表中提取數據時只有兩列STATS(_id, stat_name)。我的問題是什麼?我有一個有10個按鈕的活動,每個按鈕都與一個stat_name相關聯。當用戶按下其中一個按鈕時,應用程序正「去」到STATS表中以得到正確的_id,然後將此_id輸入到另一個表GAME_STATS(_id, PlayerId (fk), GameId(fk), StatsId(fk)(andmore))STATS._id = GAME_STATS.StatsId,我基本上必須對PlayerId執行類似的操作。從android中的SQLite中獲取單個值

現在,我在做這樣說:

public String getStatId(String statName){ 
    String statId = "Error"; 
    Cursor c = mDb.query(STAT_TABLE, new String[] {AbstractDbAdapter.STAT_ID, AbstractDbAdapter.STAT_NAME}, AbstractDbAdapter.STAT_NAME+ " = " +statName, null, null, null, null); 
    int count = c.getCount(); 
    if(count == 1){ 
     c.moveToFirst(); 
     statId = c.getString(c.getColumnIndex(AbstractDbAdapter.STAT_ID)); 
    } 
    c.close(); 
    mDb.close(); 
    Log.d("FootballApp","StatId =" +statId); 
    return statId;  
} 

什麼我的問題是,我知道,應該只有一個返回值,我還是要用光標,這樣做。此外,在我看來,它看起來複雜和耗時的方式編寫所有代碼只是爲了從一個表中獲得一個ID。我在我的應用程序中有9個表格,並且每當我需要從不同的表格中選擇_id時,我都必須編寫類似的方法,例如,只有名稱。

有人可以告訴我是否有更簡單的方法來做這一切?請:) 謝謝! :)

回答

7

我認爲它並沒有比這更簡單。然而,你可以使該方法更通用的,因此你可以重用代碼:

public String getFromDb(String tableName, String select, String selectBy, String selectName){ 
    String selection = "Error"; 
    Cursor c = mDb.query(tableName, new String[] {select}, selectBy + "=" + selectName, null, null, null, null); 
    if(c.getCount() == 1){ 
     c.moveToFirst(); 
     selection = c.getString(c.getColumnIndex(select)); 
    } 
    c.close(); 
    mDb.close(); 
    Log.d("FootballApp", select + "=" + selection); 
    return id;  
} 

用法示例:

int statID = getFromDb(STAT_TABLE, AbstractDbAdapter.STAT_ID, AbstractDbAdapter.STAT_NAME, statName); 
+0

對於更安全的代碼一點點更換 'selectBy + 「=」 + selectName,null' 與 'selectBy + 「=?」,新的String [] {selectName}' – Afilu 2017-11-24 10:24:13

7

這是因爲它得到一樣簡單,但Cursor.moveToFirst()返回false如果光標是空的所以你可以切掉c.getCount()電話,而只是說if(c.moveToFirst())。這將節省您的打字:)