1

我有一个三列数据库,其中 Android 搜索对话框工作正常。但我希望能够从两个不同的列中输入作品或短语,并让它返回搜索短语在一个或另一列或两列中的所有结果。我正在使用以下方法:

    //--- 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

因此,如果您有这样的数据库,这可以正常工作:

    COL1     COL2     COL3
______________________

Hi       there    guys
how      are      you

你在“嗨”上搜索它会返回“嗨,伙计们”。但我想要做的是搜索“你好”并让它返回所有三列的整行 - “嗨,伙计们”。我尝试添加:

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

但这会在运行搜索时使搜索崩溃。

4

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);

上一个的问题是你应该有三个单词(我从未尝试过我不确定你会得到什么结果)。另一种解决方案是创建一个选择字符串:

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];
}

好吧,它可能不完全是您正在寻找的内容,但您会根据您期望查询的内容进行调整(您还可以使用所有键/queryWord 对构建更长的选择字符串)。而且我从来没有找到更好的主意来处理这种查询。

于 2012-06-04T21:40:13.590 回答