使用Android搜索对话框搜索两个或更多数据库列

时间:2012-06-04 20:32:14

标签: android sqlite

我有一个三列数据库,其中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 + "%'"

但是在运行搜索时会导致搜索崩溃。

1 个答案:

答案 0 :(得分: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构建一个更长的选择字符串)。我从来没有找到任何更好的想法来处理这类查询。