药房APP药品类型模糊搜索实现咨询(附数据库代码)
实现药房APP药品类型模糊搜索功能指南
一、修改数据库的搜索方法
你当前的SearchMedicines方法是精确匹配药品类型,而且直接拼接SQL字符串存在SQL注入风险,得改成模糊匹配的实现:
fun searchMedicinesByType(typeKeyword: String): ArrayList<MedicineModel> { val medicines = ArrayList<MedicineModel>() // 用LIKE做模糊匹配,占位符?避免SQL注入 val cursor = dataBase.rawQuery( "SELECT * FROM $Table_Name WHERE $Col_TYPE LIKE ?", arrayOf("%$typeKeyword%") ) with(cursor) { while (moveToNext()) { val medicine = MedicineModel( getInt(getColumnIndexOrThrow(Col_ID)), getString(getColumnIndexOrThrow(Col_NAME)), getInt(getColumnIndexOrThrow(Col_QUANTITY)), getDouble(getColumnIndexOrThrow(Col_PRICE)), getString(getColumnIndexOrThrow(Col_TYPE)) ) medicines.add(medicine) } close() } return medicines }
%是SQL通配符,%$typeKeyword%表示匹配包含输入关键词的任何药品类型- 用
getColumnIndexOrThrow替代硬编码的列索引,避免后续表结构调整导致的错误 - 简化循环逻辑,用
moveToNext()直接遍历结果集
二、处理输入框的搜索触发逻辑
在你的Activity或Fragment里,给搜索输入框添加文本监听,当输入字符≥2时触发搜索:
// 假设你的输入框ID是searchTypeEt searchTypeEt.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {} override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { val input = s.toString().trim() // 输入字符≥2时执行搜索 if (input.length >= 2) { // 数据库操作放IO线程,避免卡主线程 lifecycleScope.launch(Dispatchers.IO) { val results = db.searchMedicinesByType(input) // 切回主线程更新UI withContext(Dispatchers.Main) { // 更新你的列表适配器,展示搜索结果 medicineAdapter.updateData(results) } } } else { // 输入不足2个字符时,显示全部药品 lifecycleScope.launch(Dispatchers.IO) { val allMedicines = db.ShowAllMedicines() withContext(Dispatchers.Main) { medicineAdapter.updateData(allMedicines) } } } } override fun afterTextChanged(s: Editable?) {} })
- 用
lifecycleScope处理协程,自动和页面生命周期绑定,避免内存泄漏 - 严格控制触发条件,只有输入≥2个字符才搜索,减少不必要的数据库查询
三、可选优化
1. 加速查询(针对大数据量)
如果你的药品数据很多,给type列加个索引能大幅提升模糊查询速度,在数据库的onCreate方法里加一句:
db!!.execSQL("CREATE INDEX idx_medicine_type ON $Table_Name($Col_TYPE);")
2. 显示搜索建议而非药品列表
如果要做的是搜索建议(比如匹配的药品类型选项),而不是直接显示药品,可以单独写个返回去重类型的方法:
fun getMatchingTypeSuggestions(keyword: String): ArrayList<String> { val typeList = ArrayList<String>() val cursor = dataBase.rawQuery( "SELECT DISTINCT $Col_TYPE FROM $Table_Name WHERE $Col_TYPE LIKE ?", arrayOf("%$keyword%") ) with(cursor) { while (moveToNext()) { typeList.add(getString(getColumnIndexOrThrow(Col_TYPE))) } close() } return typeList }
然后把这个返回的类型列表展示在输入框下方的下拉菜单里,用户选择后再筛选对应药品。
内容的提问来源于stack exchange,提问作者Abdallah moe
相关产品推荐
相关产品推荐

