2017-01-16 24 views
0

我想爲我的代碼做一個特定的功能。假設在我的數據庫中有一個叫做tandoori chicken的條目。如何編碼SQL部分,以便我可以用雞唐杜裏過濾數據庫,而不僅僅是固定在唐杜裏雞SQLite的子串Android

public class MyDatabase extends SQLiteAssetHelper { 

    private static final String DATABASE_NAME = "FoodDatabase1.sqlite"; 
    private static final int DATABASE_VERSION = 1; 

    public MyDatabase(Context context) { 
    super(context, DATABASE_NAME, null, DATABASE_VERSION); 
} 

getFood函數。

/* 
* Receive searchQuery in string form 
* return Cursor object 
*/ 
public Cursor getFood(String searchQuery) { 

    SQLiteDatabase db = getReadableDatabase(); 
    SQLiteQueryBuilder qb = new SQLiteQueryBuilder(); 

    String [] sqlSelect = {"_id", "FOOD", "CALORIES"}; 
    String sqlTables = "fooddb1"; 

    String whereClause=null; 
    String[] whereArgs=null; 

    /* 
    *if searchQuery is empty then null will be passed in query() function which 
    *will display all rows 
    *if searchQuery is not null it will look for match in the table 
    */ 

    if(!searchQuery.equals("")){ 
     whereClause="Food LIKE ?"; 

     /* 
     *LIKE statement will look for substring in the table if found it will add that row to cursor 
     */ 
     whereArgs= new String[] { 
       "%"+searchQuery+"%" 
     }; 
    } 

    qb.setTables(sqlTables); 

    Cursor c = qb.query(db, sqlSelect, whereClause, whereArgs, 
      null, null, null); 

    c.moveToFirst(); 
    return c; 
} 

回答

0

你只需要將空間拆分子串。例如,您已將唐杜裏雞作爲搜索查詢字符串。因此,現在您需要將查詢字符串空格分開,以生成兩個單獨的單詞 - tandoori

那麼SQL查詢應該像

Select * from foodTable where Food like 'tandoori chicken' or 'chicken tandoori' 

要做到這一點,你可能會考慮做這樣的事情。

String[] queryWords = searchQuery.split(" "); // Split by space 

現在做的話,並把它們放在一個ArrayList

private ArrayList<String> getQueryStrings(String[] queryWords) { 

    private ArrayList<String> queryStringList = new ArrayList<String>(); 
    // Now let us do some combination of words here and add each combination in the ArrayList. 
    for(int i = 0; i < possibleCombinationCount; i++) 
     queryStringList.add(getWordsCombination(i)); 

    return queryStringList; 
} 

現在根據需要製作查詢字符串。

String builder = ""; 

for(String wordsComb : getQueryStrings()) { 
    // make the query with or 
    if(builder.length != 0) builder += " or "; 
    builder += "'%" + wordsComb + "%'"; 
} 

String query = "Select * from foodTable where Food like " + builder; 

現在在您的數據庫上運行rawQuery()

db.rawQuery(query); 

該解決方案可在一個串兩個三個詞很好地工作,同時不會對長字符串很好地工作。

如果您的搜索是靈活的,就像您只想查找與給定字符串匹配的行,您可以考慮使用IN語句。

Select * from foodTable where Food in (queryWords[0], queryWords[1], ....) 

正是你需要建立自己的數據庫查詢與查詢字符串的空間queryWords陣列分離的值。

我發現this answer也與您的問題有關。

+0

這是否意味着對於queryWords數組,我需要定義所有可能的組合? – coffeeboi619

+0

對於帶有IN條款的解決方案,您不必定義所有組合。只需要將它們分成'queryWords'數組。 –

+0

你可以舉一個如何在queryWords數組中分割它們的例子嗎?謝謝! – coffeeboi619