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

Android Studio中SQLite数据读取问题:点击按钮应用崩溃求助

问题分析与修复方案

你的应用点击insert按钮崩溃,核心原因是未初始化关键变量,还有读取数据的逻辑不完善,具体问题和修复步骤如下:

1. 未初始化DatabaseHelper实例

在MainActivity的onCreate方法中,你仅声明了lateinit var databaseHelper: DatabaseHelper,但未创建实例,点击按钮调用databaseHelper.getUser()时会直接抛出UninitializedPropertyAccessException。

修复:在onCreate中初始化DatabaseHelper:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    // 新增:初始化DatabaseHelper实例
    databaseHelper = DatabaseHelper(this)
    insertbtn = findViewById(R.id.insertbtn)
    Login = findViewById(R.id.Login)
    // 新增:初始化TextView实例
    txtName = findViewById(R.id.txtName) // 替换为你布局中对应的控件ID
    txtMSSV = findViewById(R.id.txtMSSV) // 替换为你布局中对应的控件ID
    LoginActivityListener()
    read()
}

2. 未初始化TextView控件

txtName和txtMSSV仅声明了lateinit,但未通过findViewById绑定布局中的控件,调用txtName.append()时会抛出UninitializedPropertyAccessException。

修复:在onCreate中添加TextView的初始化代码(如上段代码所示),注意替换成你布局文件中实际的控件ID。

3. 读取数据逻辑不完善

当前代码仅读取数据库中的第一条数据,若存在多个用户数据,无法全部显示。建议遍历Cursor的所有条目:

修改read方法中的点击事件逻辑:

private fun read() {
    insertbtn.setOnClickListener {
        // 先清空TextView内容,避免重复追加数据
        txtName.text = ""
        txtMSSV.text = ""
        
        val cursor = databaseHelper.getUser()
        // 遍历所有数据条目
        while (cursor.moveToNext()) {
            val username = cursor.getString(cursor.getColumnIndexOrThrow(DatabaseHelper.COLUMN_USERNAME))
            val mssv = cursor.getString(cursor.getColumnIndexOrThrow(DatabaseHelper.COLUMN_MSSV))
            txtName.append("$username\n")
            txtMSSV.append("$mssv\n")
        }
        cursor.close()
    }
}

4. 额外优化建议

  • 按钮命名:当前按钮ID为insertbtn,但点击逻辑是读取数据,建议将按钮ID改为readBtn之类的名称,避免逻辑混淆。
  • 数据库操作线程:SQLite操作建议放在子线程执行,避免阻塞主线程导致ANR,推荐使用协程实现:
private fun read() {
    insertbtn.setOnClickListener {
        lifecycleScope.launch(Dispatchers.IO) {
            val cursor = databaseHelper.getUser()
            val usernameList = mutableListOf<String>()
            val mssvList = mutableListOf<String>()
            
            while (cursor.moveToNext()) {
                val username = cursor.getString(cursor.getColumnIndexOrThrow(DatabaseHelper.COLUMN_USERNAME))
                val mssv = cursor.getString(cursor.getColumnIndexOrThrow(DatabaseHelper.COLUMN_MSSV))
                usernameList.add(username)
                mssvList.add(mssv)
            }
            cursor.close()
            
            // 切换回主线程更新UI
            withContext(Dispatchers.Main) {
                txtName.text = usernameList.joinToString("\n")
                txtMSSV.text = mssvList.joinToString("\n")
            }
        }
    }
}

内容的提问来源于stack exchange,提问作者Mai Tran Thanh Nhat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 10:58:20