0

我想执行搜索操作。我正在使用 CursorAdapter 显示数据库中的数据。这是我的代码

数据库助手

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. 如您所见,我的查询已尝试过。但是,它不起作用。因为它什么也没显示。

4

2 回答 2

2

您缺少,逗号,您需要将 OR 条件分组在括号中,因为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);
于 2013-09-13T04:36:47.540 回答
0

我认为您有一个简单的优先级问题,SQL 中的 AND 优先级高于 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.

于 2013-09-13T04:38:13.173 回答