Kotlin实现SQLite中EditText内容匹配指定列并显示到TextView
问题描述
我是Kotlin新手,想要实现以下功能:当EditTextText2中的数据存在于SQLite数据库的col_name(对应字段adisoyadi)列中时,将该数据显示到TextView中。我查阅了大量文章和视频,但大多是非Kotlin语言的内容,无法适配到自己的项目中。我已经能实现打印整个数据库或搜索固定关键词的功能,但现在需要实现根据EditTextText2的内容进行搜索的功能。
当前代码
MainActivity.kt
binding.button3.setOnClickListener{ var data = db.readData() binding.textView.text ="" /*for (i in 0 until data.size){ binding.textView.append(data.get(i).id.toString()+" " +data.get(i).adsoyad+" "+data.get(i).yasi+"\n")}*/ for (i in 0 until data.size){ if (binding.editTextText2.toString()==data.get(i).adsoyad){binding.textView.append(data.get(i).adsoyad+"\n")} else{binding.textView.text="yeni"+"\n"} } }
DataBaseHelper.kt
import android.content.ContentValues import android.content.Context import android.database.sqlite.SQLiteDatabase import android.database.sqlite.SQLiteOpenHelper import android.widget.Toast val database_name = "veritabanim" val table_name = "kullanicilar" val col_name = "adisoyadi" val col_age = "yasi" val col_id = "id" class DataBaseHelper (var context: Context):SQLiteOpenHelper(context, database_name,null,1) { override fun onCreate(p0: SQLiteDatabase?) { var createTable = " CREATE TABLE "+ table_name+"("+ col_id +" INTEGER PRIMARY KEY AUTOINCREMENT,"+ col_name +" VARCHAR(256),"+ col_age +" INTEGER)" p0?.execSQL(createTable) } override fun onUpgrade(p0: SQLiteDatabase?, p1: Int, p2: Int) { TODO("Not yet implemented") } fun insertData(kullanici: kullanici){ val db =this.writableDatabase val cv = ContentValues() cv.put(col_name,kullanici.adsoyad) cv.put(col_age,kullanici.yasi) var sonuc =db.insert(table_name,null,cv) if (sonuc ==(-1).toLong()){ Toast.makeText(context,"hatali",Toast.LENGTH_LONG).show() }else{ Toast.makeText(context,"başsarili",Toast.LENGTH_LONG).show() } } fun readData(): MutableList<kullanici> { var liste:MutableList<kullanici> = ArrayList() val db = this.writableDatabase var sorgu = "Select * from "+table_name var sonuc = db.rawQuery(sorgu,null) if (sonuc.moveToFirst()){ do { var kullanici = kullanici() kullanici.yasi = sonuc.getString(sonuc.getColumnIndexOrThrow(col_age)).toInt() kullanici.id = sonuc.getString(sonuc.getColumnIndexOrThrow(col_id)).toInt() kullanici.adsoyad = sonuc.getString(sonuc.getColumnIndexOrThrow(col_name)) liste.add(kullanici) }while (sonuc.moveToNext()) } sonuc.close() db.close() return liste } }
kullanici.kt
class kullanici { var id:Int=0 var adsoyad:String="" var yasi:Int=0 constructor(adsoyad:String,yasi:Int){ this.adsoyad =adsoyad this.yasi =yasi } constructor(){} }
解决方案
1. 修复EditText文本获取错误
你当前用binding.editTextText2.toString()获取的是EditText控件的对象字符串,不是用户输入的文本,需要改成binding.editTextText2.text.toString().trim()(trim()用于去除首尾空格,避免空字符干扰)。
2. 修复循环逻辑问题
循环中每次不匹配就设置textView.text="yeni"会覆盖之前的内容,正确逻辑是:先清空TextView,遍历数据时找到匹配项就追加内容,遍历结束后如果没有找到任何匹配项,再设置提示文本。
3. 优化数据库查询(推荐)
直接读取全表再过滤效率很低,尤其是数据量大的时候,建议在DataBaseHelper中添加一个根据姓名查询的方法,只返回匹配的数据,同时使用参数化查询避免SQL注入风险。
修改后的代码
DataBaseHelper.kt 添加查询方法
在DataBaseHelper类中新增以下方法:
fun searchByAdsoyad(adsoyad: String): MutableList<kullanici> { val liste: MutableList<kullanici> = ArrayList() val db = this.readableDatabase // 参数化查询,避免SQL注入 val sorgu = "SELECT * FROM $table_name WHERE $col_name = ?" val sonuc = db.rawQuery(sorgu, arrayOf(adsoyad)) if (sonuc.moveToFirst()) { do { val kullanici = kullanici() kullanici.id = sonuc.getInt(sonuc.getColumnIndexOrThrow(col_id)) kullanici.adsoyad = sonuc.getString(sonuc.getColumnIndexOrThrow(col_name)) kullanici.yasi = sonuc.getInt(sonuc.getColumnIndexOrThrow(col_age)) liste.add(kullanici) } while (sonuc.moveToNext()) } sonuc.close() db.close() return liste }
MainActivity.kt 修改点击事件
binding.button3.setOnClickListener { val inputText = binding.editTextText2.text.toString().trim() binding.textView.text = "" // 先判断输入是否为空 if (inputText.isEmpty()) { binding.textView.text = "请输入要搜索的内容" return@setOnClickListener } val matchedData = db.searchByAdsoyad(inputText) if (matchedData.isNotEmpty()) { // 遍历匹配结果,可按需显示更多信息(如ID、年龄) for (kullanici in matchedData) { binding.textView.append("${kullanici.id} ${kullanici.adsoyad} ${kullanici.yasi}\n") } } else { binding.textView.text = "未找到匹配的数据" } }
额外优化:kullanici类改用数据类(可选)
Kotlin的数据类更适合存储数据对象,简化代码:
data class Kullanici( val id: Int = 0, val adsoyad: String = "", val yasi: Int = 0 )
注意修改DataBaseHelper中对应的类名引用。
内容的提问来源于stack exchange,提问作者Sezar
相关产品推荐
相关产品推荐

