Android Sqlite Oprationation
Я хочу выполнить операцию поиска. Я использую CursorAdapter для отображения данных из базы данных. Вот мой код
DBHelper
public Cursor fetchDataByName(String string) {
// TODO Auto-generated method stub
Cursor cursor = database.rawQuery("select ABSTRACTS_ITEM._id,ABSTRACTS_ITEM.TITLE,ABSTRACTS_ITEM.TOPIC, "
+ "ABSTRACTS_ITEM.TYPE,ABSTRACTS_ITEM.TEXT"
+ "ABSTRACT_KEY_WORDS.KEYWORDS "
+ "from ABSTRACTS_ITEM,ABSTRACT_KEY_WORDS "
+ "where ABSTRACTS_ITEM._id = ABSTRACT_KEY_WORDS._id "
+ "and ABSTRACT_KEY_WORDS.KEYWORDS like '%" + string + "%'"
+ "or ABSTRACTS_ITEM.TITLE like '%" + string + "%'", null);
return cursor;
}
Внутренняя деятельность
cursorAdapter.setFilterQueryProvider(new FilterQueryProvider() {
public Cursor runQuery(CharSequence constraint) {
return dbHelper.fetchDataByName(constraint.toString());
}
});
Ранее я мог искать данные только с Title
, Теперь я хочу найти данные в соответствии с Title or keyword
, Как видите мой запрос, попробовал с этим. Но это не работает. Потому что ничего не показывает.
2 ответа
Вы скучаете по ,
запятая и вам нужно сгруппировать ваше условие ИЛИ в скобках, потому что AND
имеет более высокий приоритет
Cursor cursor = database.rawQuery("select ABSTRACTS_ITEM._id, "
+ "ABSTRACTS_ITEM.TITLE, ABSTRACTS_ITEM.TOPIC, "
+ "ABSTRACTS_ITEM.TYPE, ABSTRACTS_ITEM.TEXT, " // <-- Comma needed
+ "ABSTRACT_KEY_WORDS.KEYWORDS "
+ "from ABSTRACTS_ITEM,ABSTRACT_KEY_WORDS "
+ "where ABSTRACTS_ITEM._id = ABSTRACT_KEY_WORDS._id "
// Group the OR condition with "()"; AND has higher precedence
+ "and (ABSTRACT_KEY_WORDS.KEYWORDS like '%" + string + "%' "
+ "or ABSTRACTS_ITEM.TITLE like '%" + string + "%')", null);
Я думаю, что у вас есть простая проблема приоритета, а в SQL приоритет выше, чем в OR. Я думаю, вы хотите, чтобы ваш SQL выглядел так:
where ABSTRACTS_ITEM._id = ABSTRACT_KEY_WORDS._id
and (
ABSTRACT_KEY_WORDS.KEYWORDS like '%' || ? || '%'
or ABSTRACTS_ITEM.TITLE like '%' || ? || '%'
)
Я также переключился на заполнители, так как использование конкатенации строк для сборки SQL слишком 1999 для меня. Это означает, что вы захотите использовать rawQuery(String sql, String\[\] selectionArgs)
версия rawQuery
,