Android SQLite数据库文件未创建及按钮无响应问题求助
Android SQLite数据库未生成+提交按钮无响应排查方案
问题现象
- 检查
data/data/应用包名路径,未找到名为prevGames的数据库文件 - 点击提交按钮后,既不跳转
gameEndPage,也不创建数据库
核心问题定位
1. 提交按钮点击时的崩溃隐患(直接导致无响应)
提交按钮的点击事件中,直接对total1等TextView文本执行Integer.parseInt,但如果玩家行被隐藏(比如p3输入为空,player3Data设为GONE),对应的total文本可能为空或未初始化,此时会抛出NumberFormatException,导致整个点击逻辑中断,既无法插入数据,也无法跳转页面。
2. DatabaseHelper的冗余与风险
- 类中定义了未赋值的静态
context,属于冗余代码,还可能引发内存泄漏,需删除 insertRecord方法中每次插入都频繁打开/关闭数据库,IO效率低且异常场景下可能无法正确释放连接
修复步骤
步骤1:修复提交按钮的异常处理与逻辑优化
修改gamePage中提交按钮的点击事件,增加异常捕获并跳过隐藏玩家的数据插入:
submit.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { DatabaseHelper dbHelper = new DatabaseHelper(gamePage.this); try { // 仅处理可见玩家的数据 if (player1Data.getVisibility() == View.VISIBLE) { String name1 = player1Input.getText().toString().trim(); if (!name1.isEmpty()) { int p1total = Integer.parseInt(total1.getText().toString()); dbHelper.insertRecord(date_n, name1, p1total); } } if (player2Data.getVisibility() == View.VISIBLE) { String name2 = player2Input.getText().toString().trim(); if (!name2.isEmpty()) { int p2total = Integer.parseInt(total2.getText().toString()); dbHelper.insertRecord(date_n, name2, p2total); } } if (player3Data.getVisibility() == View.VISIBLE) { String name3 = player3Input.getText().toString().trim(); if (!name3.isEmpty()) { int p3total = Integer.parseInt(total3.getText().toString()); dbHelper.insertRecord(date_n, name3, p3total); } } if (player4Data.getVisibility() == View.VISIBLE) { String name4 = player4Input.getText().toString().trim(); if (!name4.isEmpty()) { int p4total = Integer.parseInt(total4.getText().toString()); dbHelper.insertRecord(date_n, name4, p4total); } } // 确保跳转逻辑执行 Intent endIntent = new Intent(gamePage.this, gameEndPage.class); startActivity(endIntent); } catch (NumberFormatException e) { Toast.makeText(gamePage.this, "请输入有效的分数", Toast.LENGTH_SHORT).show(); Log.e("GamePage", "分数解析错误", e); } finally { dbHelper.close(); } } });
步骤2:优化DatabaseHelper类
删除冗余静态context,优化数据库连接管理:
import android.content.ContentValues; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; public class DatabaseHelper extends SQLiteOpenHelper { private static final String DB_NAME = "prevGames"; private static final int DB_VERSION = 1; public DatabaseHelper(Context context) { super(context, DB_NAME, null, DB_VERSION); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL("CREATE TABLE playerRecords (" + "ID INTEGER PRIMARY KEY AUTOINCREMENT, " + "DATE TEXT, " + "NAME TEXT, " + "TOTAL INTEGER);" ); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS playerRecords"); onCreate(db); } public void insertRecord(String date, String name, int total) { SQLiteDatabase db = this.getWritableDatabase(); try { ContentValues recordValues = new ContentValues(); recordValues.put("DATE", date); recordValues.put("NAME", name); recordValues.put("TOTAL", total); db.insert("playerRecords", null, recordValues); } finally { if (db != null && db.isOpen()) { db.close(); } } } }
步骤3:完善文本监听器逻辑
检查你省略的TextWatcher实现,确保每个输入框文本变化时调用updateTotal(),避免total文本为空:
player1Score1.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) {} @Override public void onTextChanged(CharSequence s, int start, int before, int count) { updateTotal(); } @Override public void afterTextChanged(Editable s) {} });
额外排查建议
- 打开Android Studio的Logcat,过滤
Error级别日志,查看点击按钮时是否有异常抛出 - 确认
gameEndPage已在AndroidManifest.xml中注册 - 使用调试模式,在提交按钮点击事件中设置断点,逐步执行定位出错环节
内容的提问来源于stack exchange,提问作者Rookus
相关产品推荐
相关产品推荐

