如何在SQLite中搜索相似的字符串

6
我想在表"TABLE_TOURS"中搜索列"COLUMN_TITLE"中与"query"相似的词,并返回一个名为"List"的列表。请帮我。
public List<Tour> getWordMatches(String query, String[] columns) {
    String selection =  ToursDBOpenHelper.COLUMN_TITLE + " MATCH ?";
    String[] selectionArgs = new String[] {query+"*"};
    return query(selection, selectionArgs, columns);
}
public List<Tour> query(String selection, String[] selectionArgs, String[] columns) {
    Log.i(LOGTAG, "getwordsmatches result"+ selection +" "+ selectionArgs);
    SQLiteQueryBuilder builder = new SQLiteQueryBuilder();
    builder.setTables(ToursDBOpenHelper.TABLE_TOURS);

    Cursor cursor = builder.query(dbhelper.getReadableDatabase(),
            columns, selection, selectionArgs, null, null, null);
    Log.i(LOGTAG, "cursor of db result "+ cursor);
    List<Tour> tours = cursorToList(cursor);
    Log.i(LOGTAG, "tours are "+ tours);
    if (cursor == null) {
        return null;
    } else if (!cursor.moveToFirst()) {
        cursor.close();
        return null;
    }
    return tours;
}

以及它的cursorToList方法:

private List<Tour> cursorToList(Cursor cursor) {
    List<Tour> tours = new ArrayList<Tour>();
    if (cursor.getCount() > 0) {
        while (cursor.moveToNext()) {
            Tour tour = new Tour();
            tour.setId(cursor.getLong(cursor.getColumnIndex(ToursDBOpenHelper.COLUMN_ID)));
            tour.setTitle(cursor.getString(cursor.getColumnIndex(ToursDBOpenHelper.COLUMN_TITLE)));
            tour.setCate(cursor.getString(cursor.getColumnIndex(ToursDBOpenHelper.COLUMN_CATE)));
            tour.setDetail(cursor.getString(cursor.getColumnIndex(ToursDBOpenHelper.COLUMN_DETAIL)));
            tour.setDescription(cursor.getString(cursor.getColumnIndex(ToursDBOpenHelper.COLUMN_DESC)));
            tour.setImage(cursor.getString(cursor.getColumnIndex(ToursDBOpenHelper.COLUMN_IMAGE)));
            tours.add(tour);
        }
    }
    return tours;
}

2
“类似单词”是什么意思? - Nathan Walters
例如用户在搜索栏中输入“dog”,会看到一个包含“dog”、“dogs”和“dogs are”的列表。 - Zakiye Maarefi
3个回答

3
您可以使用SQL LIKE语句来实现此操作。在SQL中,%字符代表0个或多个字符的任意字符串。因此,举个例子,您可以这样写:
SELECT * FROM MY_TABLE WHERE COLUMN_NAME LIKE '%dog%'

这将匹配包含“dog”的任何字符串,例如“dog”,“dogs”,“我喜欢狗”和“123dog321”。

您的确切参数将根据表的结构而有所不同,但这就是要点。


我认为问题出在 List<Tour> tours = cursorToList(cursor); 这一行,你能帮我解决吗? - Zakiye Maarefi
发布你的该方法代码,我会看看能做什么。如果你成功让LIKE语句工作了,请更新你的代码。 - Nathan Walters
我之前试过了,日志显示问题出在当列表想从游标创建时。 - Zakiye Maarefi
请发布您更新后的代码,包括您认为不起作用的方法。 - Nathan Walters
那段代码看起来对我来说很好。现在你的问题是什么?哪些部分没有按照预期工作? - Nathan Walters
显示剩余3条评论

2
尝试使用“Like”关键字,它将匹配您指定的任何语法在这里查看教程和Sqlite网页

例子: Cursor c = myDB.query(MY_DATABASE_TABLE, "songname","songname like ?" , new String[]{"%"+MATCH_STRING+"%"}, null,"SongHit", null);

(该代码段为Java代码,用于在Android应用程序中查询数据库表中的数据。)

如果您遇到了问题,请将其标记为其他人受益的解决方案。 - Mahmoud Hashim
我认为问题出在 List<Tour> tours = cursorToList(cursor); 这一行,你能帮我解决吗? - Zakiye Maarefi
请问您遇到了什么问题,请发布log cat错误,这样我才能帮助您。 - Mahmoud Hashim

1
您执行查询的方法应该像这样:
public List<Tour> findByTitle(String string) {

        String query;
        query = "SELECT * FROM tours WHERE title LIKE '%"+ string +"%'";
        Cursor cursor = database.rawQuery(query, null);
        Log.i(LOGTAG, "Returned " + cursor.getCount() + " rows");
        List<Tour> tours = cursorToList(cursor);
        return tours;
    }
}

这样做不起作用,因为LIKE后面的语句需要通配符才能正常工作。 - Nathan Walters
@NathanWalters 我自己也在使用这段代码。它确实有效。 - Kian Tamar
是的,因为你刚刚编辑了它!现在它会起作用了。 - Nathan Walters
@NathanWalters 如果你不在字符串周围加上%,它可以正常工作,但只返回具有完全相同标题的项目。我已编辑它以适应这个问题。 - Kian Tamar
这就是为什么我告诉你它不会起作用,你的答案不适合这个问题。然而,这个可以工作,所以你做得很好。 - Nathan Walters

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接