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

