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
相关产品推荐
相关产品推荐

