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

Kotlin安卓开发:实现SQLite记录列表点选展示功能求助

问题梳理
  • 首次使用Kotlin开发Android应用,已完成BOPA_record SQLite数据库的写入功能:库表包含主题列TOPIC_COL、内容列BOPA_COL,点击save按钮即可将两个EditText的输入存入表中,该部分功能运行正常。
  • 待实现交互:点击打开按钮时先展示所有历史主题列表,用户点击任意主题后,再展示对应关联的完整记录。
  • 当前实现问题:直接遍历数据库游标把所有主题、内容全量追加到输入框,拼接成无区分的长字符串,没有分层展示和点击关联逻辑,不符合预期。
改造方案

1. 优化DBHelper类,拆分查询方法

原有getName()方法是全量查所有字段,不适合分步交互的场景,替换为两个针对性的查询方法,利用表的自增主键ID做关联(避免重名主题查询错误):

// 查询所有历史记录的ID和主题,供列表展示
fun getAllTopics(): List<Pair<Long, String>> {
    val topicList = mutableListOf<Pair<Long, String>>()
    val db = readableDatabase
    val cursor = db.rawQuery("SELECT $ID_COL, $TOPIC_COl FROM $TABLE_NAME", null)
    if (cursor.moveToFirst()) {
        do {
            val recordId = cursor.getLong(cursor.getColumnIndexOrThrow(ID_COL))
            val topic = cursor.getString(cursor.getColumnIndexOrThrow(TOPIC_COl))
            topicList.add(Pair(recordId, topic))
        } while (cursor.moveToNext())
    }
    cursor.close()
    db.close()
    return topicList
}

// 根据记录ID查询对应完整内容
fun getBopaContentById(recordId: Long): String? {
    val db = readableDatabase
    val cursor = db.rawQuery(
        "SELECT $BOPA_COL FROM $TABLE_NAME WHERE $ID_COL = ?",
        arrayOf(recordId.toString())
    )
    var content: String? = null
    if (cursor.moveToFirst()) {
        content = cursor.getString(cursor.getColumnIndexOrThrow(BOPA_COL))
    }
    cursor.close()
    db.close()
    return content
}

注意:原有建表语句中ID字段缺少自增属性,建议将建表SQL里的ID列定义修改为$ID_COL INTEGER PRIMARY KEY AUTOINCREMENT,修改后卸载重装应用即可让新表结构生效。

2. 调整MainActivity交互逻辑

去掉原来直接拼接字符串到输入框的逻辑,用系统自带AlertDialog实现主题选择列表,替换openBopaEntry按钮的点击事件代码:

// 记得在文件顶部补充导包:import androidx.appcompat.app.AlertDialog
binding.openBopaEntry.setOnClickListener {
    val db = DBHelper(this, null)
    val topicList = db.getAllTopics()
    // 无数据时直接提示
    if (topicList.isEmpty()) {
        Toast.makeText(this, "暂无保存的记录", Toast.LENGTH_SHORT).show()
        db.close()
        return@setOnClickListener
    }
    // 提取主题名称生成列表数据源
    val topicNames = topicList.map { it.second }.toTypedArray()
    // 弹出主题选择弹窗
    AlertDialog.Builder(this)
        .setTitle("选择要查看的记录")
        .setItems(topicNames) { _, position ->
            // 点击对应主题时,根据ID查询完整内容并填充到输入框
            val selectedRecord = topicList[position]
            val content = db.getBopaContentById(selectedRecord.first)
            binding.bopaTopic.setText(selectedRecord.second)
            binding.bopaContent.setText(content)
        }
        .show()
    db.close()
}

原有代码中冗余的import java.util.jar.Attributes导包可以直接删除,MainActivity首行的Package首字母大写是笔误,需要改为小写package,否则会编译报错。

可选优化

  • 不需要每次点击按钮都新建DBHelper实例,可以在Activity中全局初始化一个DBHelper实例,在onDestroy生命周期中统一关闭,减少不必要的资源开销。

内容的提问来源于stack exchange,提问作者Phil Tinsley

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 19:48:34