java - 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 查询,它会使搜索变慢。如何在不影响性能的情况下以最佳方式完成我的要求?
解决方案
该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_CODE
和COLUMN_ NAME
.
此外,通过连接如此多的字符串,您会冒sql injection的风险。
我希望您检查是否searchText
包含单引号并将它们更改为双单引号,例如:
searchText = searchText.replace("'", "''");
推荐阅读
- reactjs - JvectorMap在setState reactjs之后重新渲染正确的标记
- purescript - 查找某个类的所有实例
- javascript - 如何动态获取状态数组名称 React
- mule - 如何解决错误匹配通配符严格,但找不到元素'ss:authentication-manager'的声明?
- android - 使用移动设备 GPS 更新 Windows 位置
- haskell - 列表理解和过滤元素
- amazon-web-services - 如何在 mulesoft sqs 接收请求中设置“WaitTimeSeconds”
- sql - 用于列出用户、角色并将用户添加到 Azure SQL DB 的 PowerShell 脚本
- ansible - 为什么将“ansible_python_interpreter”配置选项设置为“/usr/bin/python3”
- google-maps - 创建结算帐户是否会向我收费?