2

年、メーカー、モデルの3つの列を持つ1つのテーブルを持つcarssqliteデータベースがあります。以下のクエリで、「ford」のような1つのフレーズを検索すると、すべてのフォードの結果、つまり「1964」が表示され、その年のすべての車が表示されます。ただし、「1964ford」は「結果が見つかりません」またはnullを返します。「1964fordmustang」のように、3列すべてから検索語を入力できるようにクエリを変更するにはどうすればよいですか。はい、私は1964年のフォードマスタングのようなものがないことを知っています、それは1964年半です。しかし、私のDBには1964年のフォードマスタングの行があるので、例として「1966年のフォードマスタング」を使用しましょう。

    public Cursor searchDB(String query) {  
    return db.query(true, DB_TABLE, new String[] { KEY_ROWID, KEY_YEAR, KEY_MAKE, 
    KEY_MODEL }, KEY_YEAR + " LIKE" + "'%" + query + "%' OR " + KEY_MAKE +  
    " LIKE" + "'%" + query + "%' OR " + KEY_MODEL + " LIKE" + "'%" + query + "%'",  
    null, null, null, null, null);  
}

+の代わりにANDを使用しようとしましたが、クラッシュします。私はアンドロイド2.2を使用しています。

4

1 に答える 1

6

それが機能しない理由はあなたのcolumn LIKE %query%声明です。つまり、値には、両端に任意の数の文字を含むクエリが正確に含まれている必要があります。したがって"1964" LIKE "%1964 mustang%"、失敗し"1964 mustang" LIKE "%1964%"ますが、適切な結果が得られます。

クエリ文字列をスペースで分割し、各列を各分割文字列に対してクエリすると、探している結果が得られる可能性があります。

更新:文字列を分割してクエリを形成するためのスニペット。

public Cursor searchDB(String query) {
    /* Example: query = "1964 ford mustang" */

    String[] parts = query.split(" "); /* Should split to {"1964", "ford", "mustang"} */

    String queryString = "";
    for(int i = 0; i < parts.length; i++) {
        queryString += KEY_YEAR + " LIKE '%" + parts[i] + "%' OR ";
        queryString += KEY_MAKE + " LIKE '%" + parts[i] + "%' OR ";
        queryString += KEY_MODEL + " LIKE '%" + parts[i] + "%'";
        if(i != (parts.length - 1)) {
            queryString += " OR ";
        }
    }

    return db.query(true, DB_TABLE, 
        new String[] { KEY_ROWID, KEY_YEAR, KEY_MAKE, KEY_MODEL }, 
        queryString, null, null, null, null, null);
}
于 2012-09-20T17:35:40.550 に答える