2017-08-11 77 views
0

所以我最近一直在討論Recycler View和SQLite,我擔心我會陷入困境。在SQLite表上搜索多個(不同的)用戶輸入

面臨的挑戰是: 即使世界一的EditText視圖,其中一個用戶可以通過簡單地命名他們搜索了汽車,在品牌,製造商甚至都爲它:

「提問」的回報:本田思域

「C」返回本田思域,福特福克斯,雪佛蘭ONIX

,當我嘗試使用多個關鍵字,就會出現問題:

「漢C」返回:本田思域,本田思域,福特福克斯,雪佛蘭ONIX (我會解釋 雙本田思域錯誤)

但首先,這裏的代碼:

for(String s : query.split(" ")) { 
     cursor = db.rawQuery("Select * from brasil WHERE (maker LIKE '%" + s + "%' or model LIKE '%" + s + "%')" , null); 

     if(cursor != null && cursor.getCount() > 0) { 
      cursor.moveToFirst(); 
      do { 
       Car car = new Car(
         cursor.getString(1), 
         cursor.getString(2), 
         cursor.getString(3), 
         cursor.getInt(4), 
         cursor.getInt(5) 
       ); 
       cars.add(car); 
      } while (cursor.moveToNext()); 
     } 
    } 

雙本田思域錯誤發生的原因是: 「漢C」 2串所以2個循環 發現HON本田和c在公民中,這兩種情況都被添加到返回數據的數組中。

現在我想要發生的事情: 「Hon c」 在honda civic中發現「hon」和「c」,因此被添加。

發現「c」,但其他人沒有「hon」,所以他們不應該被添加。

回答

0

去關一下Muthukrishnan說,我想你需要select distinct並在WHERE第一個AND

String query = "Select distinct * from brasil WHERE ("; 

String[] values = query.split(" "); 

for (int i = 0; i < values.length; i++) { 
    if(i != 0) { 
     query += " AND "; 
    } 

    query += "(maker LIKE '%" + values[i] + "%' or model LIKE '%" + values[i] + "%')"; 
} 
query += ")"; 

Cursor cursor = db.rawQuery(query , null); 

if(cursor != null && cursor.getCount() > 0) { 
    cursor.moveToFirst(); 
    do { 
     Car car = new Car(
       cursor.getString(1), 
       cursor.getString(2), 
       cursor.getString(3), 
       cursor.getInt(4), 
       cursor.getInt(5) 
     ); 
     cars.add(car); 
    } while (cursor.moveToNext()); 
} 

這如果你搜索「hon c」,應該只給你「本田思域」。

+0

我明白了,你上面的人也通過從環上每個關鍵詞建立一個完整的字符串提供瞭解決方案,它的工作,但它仍然顯示不想要的結果: 例如: 「本田C」返回本田思域雪佛蘭onix,因爲後者有「c」,但在這種情況下,我希望它將resute精煉成只有本田civic,因爲雪佛蘭onix doens沒有「本田」在其中.. 另一個例子: 「c 「應該返回雪佛蘭onix和hond一個公民,但「c h」或「c ho」或「c hon」只應歸還honda civic –

+0

對不起,我直到一分鐘前纔看到你插入的代碼。我剛剛更新以反映您的問題中的編輯,所以我認爲現在應該可以解決它。 – windedmoose

+0

這工作奇蹟!非常感謝!我不知道「獨特」的可能性。謝謝! –

0

可以查詢像這樣得到複製出來,

String query = "Select * from brasil WHERE ("; 

String[] values = query.split(" "); 

for (int i = 0; i < values.length; i++) { 
    if(i != 0) { 
     query += " OR "; 
    } 

    query += "maker LIKE '%" + values[i] + "%' or model LIKE '%" + values[i] + "%' "; 
} 
query += ")"; 

Cursor cursor = db.rawQuery(query , null); 

if(cursor != null && cursor.getCount() > 0) { 
    cursor.moveToFirst(); 
    do { 
     Car car = new Car(
       cursor.getString(1), 
       cursor.getString(2), 
       cursor.getString(3), 
       cursor.getInt(4), 
       cursor.getInt(5) 
     ); 
     cars.add(car); 
    } while (cursor.moveToNext()); 
} 
+0

謝謝,這確實解決了重複的問題,雖然我仍然無法找出一種方法來篩選結果,其中「hon」和「c」被發現.. –

+0

你的結果應該只有這個權利..? ** HONDA市民,福特福克斯,雪佛蘭onix ** –

+0

或你的結果應該有** HONDA civic,雪佛蘭onix **這2只。 –