Android SQLite SELECT WHERE LIKE意外行为

时间:2011-10-23 14:09:24

标签: android sqlite

我有一个带有SQLite数据库的android应用程序,我正在尝试实现一个搜索界面。首先,我意识到制作FTS数据库是可行的方法,但我认为如果使用通配符,我可以使用LIKE语句并获得类似的结果。这样可以测试接口,并在以后更新后端。

以下是我构建查询的方法:

public Cursor getMatching(String query) {
    Cursor mCursor = db.query(false, TABLE, new String[] { KEY_ROWID,
            KEY_NAME }, KEY_NAME + " LIKE ?",
            new String[] { "%" + query + "%" }, null, null, null, null);
    if (mCursor != null) {
        mCursor.moveToFirst();
    }
    return mCursor;
}

KEY_NAME是我想要结果的文本列,query是我想要匹配的小写字符串。我希望它会返回结果,其中查询出现在名称中的任何位置,不区分大小写。但是,我观察到的是不同的。查询结果“”(空字符串):

Coch**** ****
Squi*** St*****
Owe** ****
Smi** Ca****
G. Bur** Jo******
Gr******* Brown

现在当我查询“o”时:

Owe** ****
G. Bur** Jo******
Gr******* Brown

奇怪的是,第一个结果被过滤掉了,虽然它包含一个'o'。当我查询“ow”时:

Gr******* Brown

最后当我用“自己”查询时:

null

以下是我用来处理游标的方法:

public static void logMatches(Context context, String query) {
    DBAdapter adapter = new DBAdapter(context);
    adapter.open();

    Cursor c = adapter.getMatching(query);

    if (c == null)
        return;

    while (c.moveToNext()) {
        String name = c.getString(c
                .getColumnIndex(DBAdapter.KEY_NAME));
        Log.d(TAG, name);
    }

    c.close();
    adapter.close();
}

DBAdapter包含SQLiteOpenHelper。我传入的上下文来自ContentProvider,使用getContext()方法。

我想最终实现一个FTS表,但我的数据库现在很小,所以我希望我现在可以使用现有的表实现类似的功能。是否有可能用LIKE子句做我想做的事情?我犯了一个明显的错误吗?

1 个答案:

答案 0 :(得分:1)

我自己没有尝试过,但fts实际上是在SQLite for android中实现的。例如,请参阅herehere

啊,是的。而不是while (c.moveToNext()) {}do { } while (c.moveToNext())