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

Android中CheckBox布尔值转Integer存入SQLite失败问题排查

问题排查与解决方案

看起来你在把CheckBox的布尔值转成整数存入SQLite时踩了好几个坑,我帮你逐一梳理并修正:

核心错误点分析

1. CheckBox状态获取完全错误

你现在用boxGender_m.getText().toString()获取的是CheckBox上显示的文字(比如"男"之类的),而不是它的选中状态!这直接导致Integer.parseInt()抛出异常,因为字符串无法转成整数,这是数据插入失败的主要原因。

正确的做法是用isChecked()获取布尔值,再转成1(选中)或0(未选中):

int gender_int_m = boxGender_m.isChecked() ? 1 : 0;
int gender_int_f = boxGender_f.isChecked() ? 1 : 0;
int trauma_int = boxTrauma.isChecked() ? 1 : 0;

2. EditText赋值错误

你把weight和height的取值都指向了txtName,这明显是复制粘贴时的失误:

// 错误代码
String weight = txtName.getText().toString();
String height = txtName.getText().toString();

// 修正后
String weight = txtWeight.getText().toString();
String height = txtHeight.getText().toString();

3. SQLite表创建语句语法错误

你的onCreate里的SQL语句有语法问题:

  • CREATE TABLE后面没有空格,直接接表名,会导致SQL解析失败
  • 列定义的格式也有问题,正确的格式应该是列名 类型,并且整体需要空格分隔

修正后的表创建语句:

@Override
public void onCreate(SQLiteDatabase db){
    db.execSQL("CREATE TABLE " + TABLE_NAME + " (" 
        + COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " 
        + COL_NAME + " TEXT," 
        + COL_AGE + " INTEGER NOT NULL DEFAULT 0, " 
        + COL_GENDER_M + " INTEGER NOT NULL DEFAULT 0, " 
        + COL_GENDER_F + " INTEGER NOT NULL DEFAULT 0, " 
        + COL_TRAUMA + " INTEGER NOT NULL DEFAULT 0, " 
        + COL_WEIGHT + " INTEGER NOT NULL DEFAULT 0, " 
        + COL_HEIGHT + " INTEGER NOT NULL DEFAULT 0);");
}

4. 异常处理过于草率

你的insertData方法里的catch(Exception ex){}直接吞掉了异常,导致你看不到具体的错误信息,建议添加日志打印:

catch(Exception ex){
    Log.e("DatabaseError", "插入数据失败", ex);
}

修正后的完整代码

修正后的InsertData活动代码

public class InsertData extends AppCompatActivity {
    DataBase myDb;
    EditText txtName, txtAge , txtWeight, txtHeight;
    CheckBox boxGender_m,boxGender_f,boxTrauma;
    Button btnClick;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_insert_data);
        myDb = new DataBase(this);
        txtName = findViewById(R.id.name);
        txtAge = findViewById(R.id.age);
        boxGender_m = findViewById(R.id.gender_m);
        boxGender_f = findViewById(R.id.gender_f);
        boxTrauma = findViewById(R.id.trauma);
        txtWeight = findViewById(R.id.weight);
        txtHeight = findViewById(R.id.height);
        btnClick = findViewById(R.id.InsertBtn);
        btnClick.setOnClickListener(v -> ClickMe());
    }

    private void ClickMe(){
        String name = txtName.getText().toString();
        String ageStr = txtAge.getText().toString();
        String weightStr = txtWeight.getText().toString();
        String heightStr = txtHeight.getText().toString();

        // 先简单校验输入(避免空字符串转整数)
        if(ageStr.isEmpty() || weightStr.isEmpty() || heightStr.isEmpty()){
            Toast.makeText(this, "请填写完整数据", Toast.LENGTH_SHORT).show();
            return;
        }

        int age_int = Integer.parseInt(ageStr);
        int weight_int = Integer.parseInt(weightStr);
        int height_int = Integer.parseInt(heightStr);
        // 正确的布尔转整数方式
        int gender_int_m = boxGender_m.isChecked() ? 1 : 0;
        int gender_int_f = boxGender_f.isChecked() ? 1 : 0;
        int trauma_int = boxTrauma.isChecked() ? 1 : 0;

        Boolean result = myDb.insertData( name, age_int, gender_int_m, gender_int_f, weight_int, height_int, trauma_int);
        if (result){
            Toast.makeText(this, "Data Inserted Successfully",Toast.LENGTH_SHORT).show();
        }else{
            Toast.makeText(this, "Data Inserted Failed",Toast.LENGTH_SHORT).show();
        }
        Intent i = new Intent(this,ResultData.class);
        startActivity(i);
    }
}

修正后的Database代码

public class DataBase extends SQLiteOpenHelper{
    public static final String DATABASE_NAME = "DataOfSchedule.db";
    public static final String TABLE_NAME = "DataOfSchedule_table";
    public static final String COL_ID = "ID";
    public static final String COL_NAME = "NAME";
    public static final String COL_AGE = "AGE";
    public static final String COL_GENDER_M = "GENDER_M";
    public static final String COL_GENDER_F = "GENDER_F";
    public static final String COL_WEIGHT = "WEIGHT";
    public static final String COL_HEIGHT = "HEIGHT";
    public static final String COL_TRAUMA = "TRAUMA";

    public DataBase(Context context){
        super(context, DATABASE_NAME, null,1);
    }

    @Override
    public void onCreate(SQLiteDatabase db){
        db.execSQL("CREATE TABLE " + TABLE_NAME + " (" 
            + COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " 
            + COL_NAME + " TEXT," 
            + COL_AGE + " INTEGER NOT NULL DEFAULT 0, " 
            + COL_GENDER_M + " INTEGER NOT NULL DEFAULT 0, " 
            + COL_GENDER_F + " INTEGER NOT NULL DEFAULT 0, " 
            + COL_TRAUMA + " INTEGER NOT NULL DEFAULT 0, " 
            + COL_WEIGHT + " INTEGER NOT NULL DEFAULT 0, " 
            + COL_HEIGHT + " INTEGER NOT NULL DEFAULT 0);");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
        onCreate(db); // 升级时重新创建表(如果需要保留数据,这里要做数据迁移)
    }

    public boolean insertData(String name, Integer age, Integer gender_m, Integer gender_f, Integer weight, Integer height, Integer trauma){
        boolean success = false;
        try{
            SQLiteDatabase db = this.getWritableDatabase();
            ContentValues contentValues = new ContentValues();
            contentValues.put(COL_NAME, name);
            contentValues.put(COL_AGE, age);
            contentValues.put(COL_GENDER_M, gender_m);
            contentValues.put(COL_GENDER_F, gender_f);
            contentValues.put(COL_WEIGHT, weight);
            contentValues.put(COL_HEIGHT, height);
            contentValues.put(COL_TRAUMA, trauma);
            long result = db.insert(TABLE_NAME,null,contentValues);
            db.close();
            if(result != -1) success = true;
        } catch(Exception ex){
            Log.e("DatabaseInsertError", "插入数据异常", ex);
        }
        return success;
    }

    public Cursor getALLData(){
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor res = db.rawQuery("Select * from "+ TABLE_NAME,null);
        return res;
    }
}

额外建议

  • 对于EditText的整数输入,建议在XML里设置android:inputType="number",避免用户输入非数字字符
  • 如果需要保留数据库升级时的数据,onUpgrade方法需要实现数据迁移逻辑,而不是直接删表重建
  • 可以用try-catch包裹Integer.parseInt,避免用户输入非数字时崩溃

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:07:49