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

guz6ccqo  于 2023-05-18  发布在  SQLite
关注(0)|答案(1)|浏览(119)

如何搜索而不写所有的词我想当用户输入类型如果他写像两个字母来显示建议的结果我的项目是一个应用程序的药房你可以inseart药物然后显示它在另一个活动也可以删除药物从列表和数据库这是我的数据库代码

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
    }
}
5kgi1eie

5kgi1eie1#

您可以将LIKE%野生字符沿着使用,例如:

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

因此,如果传递的type值是a,那么将返回sabcdef cdeafg这样的行。
请注意,建议将参数(即使用?作为占位符,并通过rawQuery函数的第二个参数传递值)以防止SQL注入。
例如

var c = dataBase.rawQuery("SELECT * FROM $Table_Name WHERE $Col_TYPE LIKE '%'||?||'%'", arrayOf(type))
  • 注意,绑定值是封闭的,并且在这种用法中,需要使用||运算符连接野生字符。

相关问题