2011-08-24 125 views
1

我有這個查詢返回基於在我的應用程序中的窗體內傳遞的一些參數的特定記錄。這是我得到的問題:SQLite查詢不斷崩潰

String[] args={"act_email,act_password"}; 
Cursor cursor= db.query(DB_TABLE_NAME,new String[]{"email","password"},"email"+" like" + " %?%"+"AND"+" password "+" like" + " %?%",new String[]{"act_email,act_password"},null,null, null); 

下面是一些代碼,我在網上找到:

Cursor cursor= db.rawQuery("SELECT email,password FROM users WHERE email LIKE '%' || ? || '%' and password LIKE '%' || ? || '%'",args); 

此代碼不會造成任何問題,但它確實需要一些優化,主要是因爲它總是返回空值。有關如何解決此問題的任何建議?

+0

http://stackoverflow.com/questions/3489045/sqlite-like-alternative-for-regexp-match-start-of-any-word –

+0

我發佈了一個更新的答案。 – Merlin

+0

好吧,我其實在我自己的應用程序中試過這個,發現文本限定符似乎是自動處理的,我更新了我的答案以反映我的經驗,並指出了一個可行的解決方案,請閱讀我的答案並接受如果這能解決您的問題。這將幫助他人閱讀這個問題。 – Merlin

回答

1

你的ARG遊戲不正確,因爲它缺少兩個元素之間的引號......你必須有大括號之間的2個獨立的字符串。這應該閱讀:

String[] args= {"act_email","act_password"}; 

編輯(開始)

其次你缺少你的查詢選擇字符串的 '文本識別符,對於文本字段,這些應該是這樣的形式:

field ='?'

SQLite的似乎是自行處理的處理報價,因此,所有你需要做的提供形式的where子句:

field=? [ AND field2=? ... AND fieldn=? ] 

,然後在args數組提供參數。 Androids OpenDatabaseHelper類似乎根據類型自動處理文本限定符。

編輯(完)

請注意,以這種方式在Android上使用SQLite的不喜歡的查詢字符串% wilcards是參數化查詢。要使用通配符將它們放入參數值中,並在執行過程中替換它。所以,你的ARGS成爲:

String[] args= {"%act_email%","%act_password%"}; 

或者如果你想在這裏使用的變量:

String[] args= {"%" + act_email + "%", "%" + act_password+ "%"}; 

所以完整的代碼應該是這個樣子:

String[] fields = {"email","password"}; 
String[] args= {"%" + act_email + "%", "%" + act_password+ "%"}; 

//do not use like for usr & pwd 
String where = "email like ? AND password like ?"; 

Cursor cursor= db.query(DB_TABLE_NAME, fields , where, args,null, null, null); 

雖然我shoulld指出在電子郵件和密碼的情況下,您不應使用like

更改條款的地方:

String where = "email=? AND password =?";//do not use like for usr & pwd 
3

爲什麼要連接那麼多?

您的第一個條件與AND之間缺少空格。

使用"email like '%?%' AND password like '%?%'"作爲第三個參數。

另外:你確定要接受每個密碼輸入,這是數據庫中存儲的密碼的一部分嗎?在這種情況下,即使密碼是「thejdsfsdaf2313 !!!」,「e」也是有效的輸入。

+0

謝謝,你說得對。更正它。 – Zento

+0

嘗試過..相同的結果..感謝您的回覆 – ewom2468

1
String[] args={"act_email,act_password"}; 
     Cursor cursor= db.query(DB_TABLE_NAME,new String[]{"email","password"}, 
"email like '%"+args[0]+"%' and password like '%"+args[1]+"%'",args,null,null, null); 
+0

謝謝..即使崩潰雖然 – ewom2468

1

你試過這樣嗎?我舉了一個例子。

Cursor cursor1=db.rawQuery("SELECT taskid,taskname,taskdescription,tasktime,issync,userid,taskdate FROM task WHERE taskname like '%"+strTaskName+"%'", null);