2010-07-29 94 views
1

我試圖讓我的Android應用程序中的SQLite數據庫對象。我知道該聯繫人在數據庫中,因爲當我添加它並嘗試通過ID查找時,它會返回該對象。當我嘗試通過名字和姓氏來查找時,它會拋出一個異常,並且Im留下一個空引用。以下是查詢:SQLite查詢在Android中拋出異常

cursor = mDb.query(DB_CONTACTS_NAME, 
    new String[] {KEY_ID, KEY_LAST_NAME, KEY_FIRST_NAME, KEY_EMAIL_ADDRESS, 
       KEY_ORGANIZATION_NAME, KEY_LABEL, KEY_LABEL_POSITION}, 
    KEY_FIRST_NAME + "=" + first + " AND " + KEY_LAST_NAME + "=" + last, 
    null, null, null, null 
); 

我也試圖找到剛纔的名字,只是由姓氏。與上述結果相同。

編輯:唯一的例外是一個SQLite例外

no such column: aurelius: , while compiling: SELECT _id, last_name, first_name, 
email_address, organization_name, label, label_position FROM contacts WHERE 
first_name=marcus AND last_name=aurelius 

而且還當試圖只選擇姓氏或名字

no such column: marcus: , while compiling: SELECT _id, last_name, first_name, 
email_address, organization_name, label, label_position FROM contacts WHERE 
first_name=marcus 
+0

什麼是異常類型和消息? – Akusete 2010-07-29 02:32:58

+0

Alrighty,剛剛編輯了這個問題來澄清。感謝您提前提供幫助。 – 2010-07-29 02:38:35

回答

3

您需要引用文字字符串發生。這應該工作:

cursor = mDb.query(DB_CONTACTS_NAME, 
    new String[] {KEY_ID, KEY_LAST_NAME, KEY_FIRST_NAME, KEY_EMAIL_ADDRESS, 
       KEY_ORGANIZATION_NAME, KEY_LABEL, KEY_LABEL_POSITION}, 
    KEY_FIRST_NAME + "='" + first + "' AND " + KEY_LAST_NAME + "='" + last + "'", 
    null, null, null, null 
); 

否則,當SQL解釋看到的

first_name=marcus 

你不能指望它知道,「馬庫斯」不是一個表名或變量。

在旁註中嘗試搜索姓氏「Billy」「); drop drop contacts;」

DO NOT CONSTRUCT SQL QUERIES FROM DATA STRINGS

而是使用查詢它接受的參數列表。在文檔中搜索類似

String[] myArguments = new String[] {first, last}; 
cursor = mDb.query("SELECT * FROM contacts WHERE first_name = ? AND last_name = ?;", myArguments); 

這樣更安全。在你的版本中,如果'first'或'last'變量包含SQLite解釋爲命令的控制字符,那麼你可能會破壞你的數據庫系統。 不這樣做 ... EVER

+1

你先生,是對的。我從來沒有想過我會在一段時間後看過這部漫畫的時候犯這個錯誤,但是,我很確定。 – 2010-07-29 03:27:12

0

是的,這就是答案!我希望我有點投票!具體來說,WHERE子句具有的琴絃有他們周圍的單引號:

KEY_FIRST_NAME + 「= '」 +第一+ 「' 和」 + KEY_LAST_NAME + 「= '」 +最後+ 「'」