如何在不写整个单词的情况下进行搜索

问题描述 投票:0回答:1

如何在不写下所有单词的情况下进行搜索 我想当用户输入类型时,如果他写了两个字母来显示建议的结果 我的项目是一个药店的应用程序,你可以插入药物然后在另一个活动中展示它 您也可以从列表和数据库中删除药物 这是我的数据库代码

data class MedicineModel (val id:Int , val name:String , val quantity :Int , val price:Double , val type:String )
class DataBase(context: Context):SQLiteOpenHelper(context , DataBase_Name , null , DataBase_Version) {
    var dataBase :SQLiteDatabase
    companion object{
        var DataBase_Name = "Pharmacy.db"
        var DataBase_Version = 1
        var Table_Name = "Medicine"
        var Col_ID = "id"
        var Col_NAME = "name"
        var Col_QUANTITY = "quantity"
        var Col_PRICE = "price"
        var Col_TYPE = "type"
    }
    init {
        dataBase = this.writableDatabase
    }
    override fun onCreate(db: SQLiteDatabase?) {
        db!!.execSQL("Create Table $Table_Name ($Col_ID INTEGER primary key Autoincrement, $Col_NAME Text Not Null ," +
                " $Col_QUANTITY Integer Not Null , $Col_PRICE Double Not Null ,$Col_TYPE Text Not Null )")
    }

    override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {
        db!!.execSQL("Drop Table if exists $Table_Name")
        onCreate(db)
    }
    fun AddMedicine(name: String , quantity: Int , price: Double ,type: String ):Boolean{
        var cv = ContentValues()
        cv.put(Col_NAME , name)
        cv.put(Col_QUANTITY , quantity)
        cv.put(Col_PRICE , price)
        cv.put(Col_TYPE, type)
       return dataBase.insert("$Table_Name" , null , cv) >0
    }
    fun ShowAllMedicines():ArrayList<MedicineModel>{
        var medicines = ArrayList<MedicineModel>()
        var c = dataBase.rawQuery("Select * From $Table_Name" , null)
        c.moveToFirst()
        while (!c.isAfterLast){
            var s = MedicineModel(c.getInt(0) , c.getString(1) ,c.getInt(2)
                , c.getDouble(3) , c.getString(4))
            medicines.add(s)
            c.moveToNext()
        }
        c.close()

        return medicines
    }
    fun SearchMedicines(type: String):ArrayList<MedicineModel>{
        dataBase = this.readableDatabase
        var medicines = ArrayList<MedicineModel>()
        var c = dataBase.rawQuery("Select * From $Table_Name where $Col_TYPE = '$type' ", null)
        c.moveToFirst()
        while (!c.isAfterLast){
            var s = MedicineModel(c.getInt(0) , c.getString(1) ,c.getInt(2)
                , c.getDouble(3) , c.getString(4))
            medicines.add(s)
            c.moveToNext()
        }
        c.close()

        return medicines
    }

    fun deleteMedicine (id: Int):Boolean{
        return dataBase.delete( Table_Name , "$Col_ID = $id" ,null ) >0
    }
}
sqlite
1个回答
0
投票

您使用

LIKE
以及
%
通配符,例如

Select * From $Table_Name where $Col_TYPE LIKE '%$type%'

因此,如果传递的类型的值为 a,则将返回诸如 s abcdef cdeafg 的行。

您应该注意,建议绑定参数(即使用 ? 作为占位符并通过 rawQuery 函数的第二个参数传递值)以防止 SQL 注入。

例如

var c = dataBase.rawQuery("SELECT * FROM $Table_Name WHERE $Col_TYPE LIKE '%'||?||'%'", arrayOf(type))
  • 注意绑定值被括起来,在此用法中需要使用
    ||
    运算符连接通配符。
© www.soinside.com 2019 - 2024. All rights reserved.