1

Android 検索ダイアログが正しく機能している 3 列の DB があります。しかし、2 つの異なる列から作品または語句を入力して、検索された語句がいずれかの列、または両方の列にあるすべての結果を返すようにしたいと考えています。私は以下の方法を使用しています:

    //--- GET RECORDS FOR SEARCH
public Cursor searchDB(String query) {  
return db.query(true, DB_TABLE, new String[] { KEY_ROWID, KEY_COLUMN1, KEY_COLUMN2, 
KEY_COLUMN3 }, KEY_COLUMN1 + " LIKE" + "'%" + query + "%' OR " + KEY_COLUMN2 +  
" LIKE" + "'%" + query + "%' OR " + KEY_COLUMN3 + " LIKE" + "'%" + query + "%'",  
null, null, null, null, null);  
}
//--- END Get Records for Search

したがって、次のような DB がある場合、これは正常に機能します。

    COL1     COL2     COL3
______________________

Hi       there    guys
how      are      you

「こんにちは」で検索すると、「こんにちは、みんな」が返されます。しかし、私がやりたいのは、「こんにちは」で検索し、3 つの列すべての行全体 (「こんにちは、みんな」) を返すことです。追加してみました:

OR "+ KEY_COLUMN2 + KEY_COLUMN3 + " LIKE" + "'%" + query + "%'"

ただし、検索の実行時に検索がクラッシュします。

4

1 に答える 1

1

データベースにクエリを実行する前に、もう 1 つの手順を適用する必要があると思います。

query文字列を単語の配列に分割する必要があります。

その場合の解決策は、selectionArgs パラメータを使用してクエリの単語を渡すことです。

String[] queryWords = splitInWords(query); // your own method to split a string in words
db.query(true, DB_TABLE, new String[] { KEY_ROWID, KEY_COLUMN1, KEY_COLUMN2, KEY_COLUMN3 }, 
KEY_COLUMN1 + " LIKE" + " ? OR " + KEY_COLUMN2 + " LIKE" + " ? OR " + KEY_COLUMN3 + " LIKE" + " ?", queryWords, null, null, null, null);

この前の問題は、単語が 3 つあることになっていることです (試したことがないので、どのような結果が得られるかわかりません)。別の解決策は、選択文字列を作成することです。

String[] queryWords = splitInWords(query); // your own method to split a string in words
String selection = "";
String[] keyColumns = new String[]{KEY_COLUMN1, KEY_COLUMN2, KEY_COLUMN3};
for (int i = 0; i < queryWords.length; i++){
  if ( i > 1){
  selection += " OR ";
  }
selection += keyColumns[i] + " LIKE " + queryWords[i];
}

それはまさにあなたが探しているものではないかもしれませんが、クエリされると予想されるものに応じて適応します (key/queryWord のすべてのペアを使用して、より長い選択文字列を作成することもできます)。そして、この種のクエリを処理するためのより良いアイデアは見つかりませんでした.

于 2012-06-04T21:40:13.590 に答える