You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 14:01:14