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

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) {}
});

额外排查建议

  1. 打开Android Studio的Logcat,过滤Error级别日志,查看点击按钮时是否有异常抛出
  2. 确认gameEndPage已在AndroidManifest.xml中注册
  3. 使用调试模式,在提交按钮点击事件中设置断点,逐步执行定位出错环节

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 16:22:02