首页 > 解决方案 > Sqlite-按所需顺序显示结果

问题描述

我创建了一个包含两列的 sqlite 表 -代码名称,并在其中存储了数据。为用户提供了一个搜索视图以输入代码或名称,应用程序会相应地显示结果。

我正在使用以下查询来获取结果-

cursor = db.query(TABLE_SEARCH, columns, COLUMN_CODE + " LIKE '" +
        searchText + "%' or " + COLUMN_ NAME + " LIKE '%" + searchText + "%'", null, null, null, null)

但问题是它没有按所需的顺序显示结果。我想按以下顺序显示结果-

1.在顶部显示代码与搜索文本完全匹配的结果。

2.下方显示名称与搜索文本完全匹配的结果。

3.下方显示以搜索文本开头的代码的结果。

4.下方显示名称包含搜索文本的结果。

如果我运行多个 sqlite 查询,它会使搜索变慢。如何在不影响性能的情况下以最佳方式完成我的要求?

标签: javaandroidsqliteandroid-sqliteandroid-cursor

解决方案


query()方法的最后一个参数是 ORDER BY 子句。
尝试条件排序:

cursor = db.query(
    TABLE_SEARCH, 
    columns, 
    COLUMN_CODE + " LIKE '" + searchText + "%' OR " + 
    COLUMN_ NAME + " LIKE '%" + searchText + "%'", 
    null, 
    null, 
    null, 
    "CASE " + 
    "WHEN " + COLUMN_CODE + " = '" + searchText + "' THEN 1 " +
    "WHEN " + COLUMN_ NAME + " = '" + searchText + "' THEN 2 " +
    "WHEN " + COLUMN_CODE + " LIKE '" + searchText + "%' THEN 3 " +
    "WHEN " + COLUMN_ NAME + " LIKE '%" + searchText + "%' THEN 4 " + 
    "END, " + COLUMN_CODE + ", " + COLUMN_ NAME
)

为了获得更好的性能,您应该为列COLUMN_CODECOLUMN_ NAME.
此外,通过连接如此多的字符串,您会冒sql injection的风险。
我希望您检查是否searchText包含单引号并将它们更改为双单引号,例如:

searchText = searchText.replace("'", "''");

推荐阅读