2011-04-24 9 views
1

問題我有一個數據庫,其中包含一個動物表,其中包含_id,name,biography的列。Android:與SQLite查詢

我想根據用戶選擇的動物(從列表中)查詢特定傳記的數據庫,問題是遊標只會返回數據庫中的第一個傳記,或根本沒有。

任何人都可以看到問題可能是什麼,或提供一些有用的建議,我會非常感激。

// Code for obtaining position 
protected void onListItemClick(ListView l, View v, int position, long id){ 
     Intent animalIntent = new Intent(this, Animal.class); 
     animalIntent.putExtra("pos", position); 
     startActivity(animalIntent);  
    } 

//查詢數據庫中的bio,其中KEY_ROWID是通過列表中項目的「位置」查詢的。 myCursor = dbm.getBio(position);

if(myCursor.moveToFirst()){ 

    // querying the cusor, retrieve in index of column BIOGRAPHY, store as column index. 
     int bio_index = myCursor.getColumnIndexOrThrow(MyDBManager.KEY_BIOGRAPHY); 

     // return the string from the cursor @ column index 
    String bio = myCursor.getString(bio_index); 

    // find textview 
     animalBio = (TextView)findViewById(R.id.bio); 

     // Set textView to value of string returned from myCursor @ bio_index 
    animalBio.setText(bio); 
    } 

//該方法總是返回

return qmDB.query(ANIMAL_TABLE, new String[]{ 
      KEY_ROWID, 
      KEY_BIOGRAPHY, 
      }, 
      KEY_ROWID, 
      null, 
      null, 
      null, 
      null); 
} 

存儲在數據庫中存儲的 公共光標getBio(INT位置)中的數據庫的基礎資料的第一個值{I已經嘗試其它變化如KEY_ROWID =「+」= position,KEY_ROWID =「?」,將位置轉換爲字符串,傳入位置爲long類型,硬編碼數字等。

所以,你看到我感覺問題在於查詢語句,它根本不會返回任何其他比第一行還是IF,它不顯示!

SOLUTION:

記得在應用程序上更新您的數據庫。

+0

你能否提供獲取'position'的代碼? – pecka85 2011-04-25 11:06:11

+0

肯定pecka,我已經更新了與代碼原來的職位,還有一些關於我如何解決問題的新解釋。 – Jnanathan 2011-04-25 13:41:24

+0

我已經設法解決了這個問題,因爲事實證明我沒有更新DB.4天和無數小時的沮喪感,不會忘記這一點,感謝大家提供有用的建議。 – Jnanathan 2011-04-25 14:27:41

回答

0

和JDBC結果集一樣,您需要調用'moveToNext()'方法來移動光標。例如:

while(myCursor.moveToNext()){ 
    bio = myCursor.getString(bio_index); 
    // etc... 
} 

光標的JavaDoc:http://developer.android.com/reference/android/database/Cursor.html

公共抽象布爾使用MoveToNext()

自:API級別1

將光標移動到 下一行。如果光標已經超過 結果集中的最後一個條目,則此方法將返回 。

返回:此舉是否成功

+0

嗨維森特,沒有必要使用moveToNext(),因爲我只想返回一個特定的動物選擇的單個生物。應用程序的流程如下:動物列表 - >動物頁面(包括圖片,和'傳記'和'回'按鈕) - >動物傳記頁面。所以你看,我根據列表中的動物位置查詢數據庫。我使用這個位置映射表中的_ID字段並返回相應的傳記。 – Jnanathan 2011-04-24 19:58:02

+0

明白了。我們可以看到你的List Handler嗎? – 2011-04-24 20:06:27

+0

通過listHandler你在談論列表Activity嗎?我跑了一個測試,看看是否正確傳遞了正確的位置,結果證明沒問題。 – Jnanathan 2011-04-24 20:15:44

0

做這樣的事情:

Cursor c=null; 
c=; 
try { 
if (c!=null) { 
for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) { 

} 

} 
} finally { 
if (c!=null) { 
c.close(); 
} 
} 
+0

嗨奔騰,我試圖用這個代碼解決問題,它不工作!我可以訪問數據庫沒有問題,它會返回信息給我。我只是感覺問題與行ID有關和列表項的定位。 – Jnanathan 2011-04-24 20:16:59

+0

我們沒有關於'position'的信息。如果我的預感是正確的,那可能是選擇列表中的連續數字。您需要將適配器跳到該位置並檢索該位置上記錄的唯一標識,並傳遞唯一標識而不是位置。 – Pentium10 2011-04-24 20:19:15

+0

你的預感是正確的,但我沒有使用適配器,而是我使用上面的代碼返回遊標,檢索傳記的列索引,並將textView設置爲biography的值。是否可以在此執行此操作方式? – Jnanathan 2011-04-24 20:22:15

0

我認爲問題在於你在做你的SQL查詢的方式。以下代碼應該可以解決您的問題。

public Cursor getBio(int position) { 
    return qmDB.query(ANIMAL_TABLE, new String[]{KEY_ROWID,KEY_BIOGRAPHY}, "KEY_ROWID=?", new String[]{ position }, null, null, null); 
} 
+0

他的查詢看起來不錯。 – Ian 2011-04-25 03:02:12

+0

嗨Raunak,感謝您的建議,我已經嘗試過這種方法,不幸的是它沒有工作! – Jnanathan 2011-04-25 13:42:26

0

這似乎侮辱,但使用sqlitebrowser並確保您的唯一ID的真的是唯一的(也許你忘了自動增量?)你的代碼現在看起來不錯。

+0

嗨伊恩,我的創建語句包括一個自動增量,我知道有多行,因爲列表中充滿了來自同一張表的多個動物。 – Jnanathan 2011-04-25 13:43:40

+0

我想你編輯了你的查詢方法。第三個參數肯定是(KEY_ROWID +「=」+位置),除非你使用?標記語法。 – Ian 2011-04-25 16:07:50

+0

是的,你的正確!我的查詢沒有問題,事實證明,整個問題都是基於數據庫bing outdated..grr。 – Jnanathan 2011-04-25 16:44:03

0

既然你說你有一個列表,我假設你正在使用onListItemClick方法。因此,從用戶點擊的項目中獲取名稱(根據您的表格的位置1)。

@Override 
    protected void onListItemClick(ListView l, View v, int position, long id) { 
     super.onListItemClick(l, v, position, id); 
     Cursor o = (Cursor) this.getListAdapter().getItem(position); 
     dbm.getBio(o.getString(1)); 
    } 

您在查詢中使用的位置在我看來是有缺陷的。這是我認爲你想要在你的getBio方法中做的事情:

public Cursor getBio(String name) { 
    return this.dbm.query(ANIMAL_TABLE, new String[]{KEY_BIOGRAPHY},"name='" + name + "'", null, null, null, null); 
}