Kotlin安卓开发:实现SQLite记录列表点选展示功能求助
问题梳理
- 首次使用Kotlin开发Android应用,已完成
BOPA_recordSQLite数据库的写入功能:库表包含主题列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
相关产品推荐
相关产品推荐

