Android Studio中SQLite插入数据仅读取county字段值问题求助
问题根源与解决方案
嘿,我一眼就揪出了你的问题——你把所有EditText控件都重复赋值给了同一个变量,这直接导致所有字段都只能取到最后一个绑定的输入框(也就是county)的值!
核心问题分析
看你在onCreate里的这段代码:
editText = findViewById(R.id.editText); editText = findViewById(R.id.editTextLast); editText = findViewById(R.id.editPassword); // ... 后面所有EditText都赋值给同一个editText变量
每次赋值都会覆盖之前的控件引用,最后editText变量只会指向最后一个绑定的R.id.county输入框。所以你在点击添加按钮时,所有editText.getText().toString()调用,拿到的都是county输入框的内容。
除此之外,还有两个隐藏的坑需要修复:
- 密码转
Integer会崩溃:如果用户输入的密码包含非数字字符,Integer.parseInt()会直接抛出异常导致APP闪退。 - 参数与数据库字段不匹配:你的
DatabaseHelper中,COL4是电话号码字段,但你却把密码(本该对应COL10)传了进去,完全搞反了参数顺序。
完整修复方案
1. 修改MainDatabase.java
为每个EditText声明独立变量,绑定对应控件,并正确获取各字段值,同时处理输入验证和类型转换问题:
import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; public class MainDatabase extends AppCompatActivity { private static final String TAG = "MainDatabase"; DatabaseHelper mDatabaseHelper; private Button btnAdd, btnViewData; // 为每个输入框声明独立变量,命名更清晰 private EditText editName; private EditText editLastName; private EditText editPassword; private EditText editPasswordConfirm; private EditText editPhone; private EditText editEmail; private EditText editAddress1; private EditText editAddress2; private EditText editPostcode; private EditText editCounty; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 分别绑定对应的控件ID,不再重复覆盖 editName = findViewById(R.id.editText); editLastName = findViewById(R.id.editTextLast); editPassword = findViewById(R.id.editPassword); editPasswordConfirm = findViewById(R.id.editPasswordConfirm); editPhone = findViewById(R.id.editPhoneNumber); editEmail = findViewById(R.id.editEmailAddress); editAddress1 = findViewById(R.id.editAddressLine1); editAddress2 = findViewById(R.id.editAddressLine2); editPostcode = findViewById(R.id.postcodeUser); editCounty = findViewById(R.id.county); btnAdd = findViewById(R.id.btnAdd); btnViewData = findViewById(R.id.btnView); mDatabaseHelper = new DatabaseHelper(this); btnAdd.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 从各自的输入框获取值,同时去除首尾空格 String name = editName.getText().toString().trim(); String lastName = editLastName.getText().toString().trim(); String password = editPassword.getText().toString().trim(); String passwordConfirm = editPasswordConfirm.getText().toString().trim(); String phone = editPhone.getText().toString().trim(); String email = editEmail.getText().toString().trim(); String address1 = editAddress1.getText().toString().trim(); String address2 = editAddress2.getText().toString().trim(); String postcode = editPostcode.getText().toString().trim(); String county = editCounty.getText().toString().trim(); // 基础输入验证 if (name.isEmpty() || lastName.isEmpty() || password.isEmpty() || phone.isEmpty()) { toastMessage("请填写所有必填字段!"); return; } if (!password.equals(passwordConfirm)) { toastMessage("两次输入的密码不一致!"); return; } // 调用插入方法,参数顺序和DatabaseHelper对应 AddData(name, lastName, phone, address1, address2, postcode, county, email, password); // 清空所有输入框 editName.setText(""); editLastName.setText(""); editPassword.setText(""); editPasswordConfirm.setText(""); editPhone.setText(""); editEmail.setText(""); editAddress1.setText(""); editAddress2.setText(""); editPostcode.setText(""); editCounty.setText(""); } }); btnViewData.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainDatabase.this, ListDataActivity.class); startActivity(intent); } }); } // 调整参数顺序,和DatabaseHelper的addData方法对应 public void AddData(String name, String lastName, String phone, String address1, String address2, String postcode, String county, String email, String password) { boolean insertData = mDatabaseHelper.addData(name, lastName, phone, address1, address2, postcode, county, email, password); toastMessage(insertData ? "数据插入成功!" : "插入失败,请重试!"); } private void toastMessage(String message){ Toast.makeText(this,message, Toast.LENGTH_SHORT).show(); } }
2. 修改DatabaseHelper.java
修正字段与参数的对应关系,同时把电话号码字段改为TEXT类型(实际场景中电话号码常包含+、-等符号,用Integer存储会有问题):
import android.content.ContentValues; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.util.Log; public class DatabaseHelper extends SQLiteOpenHelper { private static final String TAG = "DatabaseHelper"; private static final String TABLE_NAME = "people_table"; private static final String COL1 = "ID"; private static final String COL2 = "name"; private static final String COL3 = "lastname"; private static final String COL4 = "phonenumber"; private static final String COL5 = "addressline1"; private static final String COL6 = "addressline2"; private static final String COL7 = "postcode"; private static final String COL8 = "county"; private static final String COL9 = "email"; private static final String COL10 = "password"; public DatabaseHelper(Context context) { super(context, TABLE_NAME, null, 2); // 版本号+1,触发表结构更新 } @Override public void onCreate(SQLiteDatabase db) { // 把phonenumber字段改为TEXT,适配更多电话号码格式 String createTable = "CREATE TABLE " + TABLE_NAME + " (" + COL1 + " INTEGER PRIMARY KEY AUTOINCREMENT," + COL2 +" TEXT," + COL3 +" TEXT," + COL4 +" TEXT," + COL5 +" TEXT," + COL6 +" TEXT,"+ COL7 +" TEXT,"+ COL8 +" TEXT,"+ COL9 +" TEXT,"+ COL10 +" TEXT" + ")"; db.execSQL(createTable); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME); // 修复原SQL的语法错误 onCreate(db); } // 调整参数顺序,确保和数据库字段一一对应 public boolean addData(String name, String lastName, String phone, String address1, String address2, String postcode, String county, String email, String password) { SQLiteDatabase db = this.getWritableDatabase(); ContentValues contentValues = new ContentValues(); contentValues.put(COL2, name); contentValues.put(COL3, lastName); contentValues.put(COL4, phone); contentValues.put(COL5, address1); contentValues.put(COL6, address2); contentValues.put(COL7, postcode); contentValues.put(COL8, county); contentValues.put(COL9, email); contentValues.put(COL10, password); long result = db.insert(TABLE_NAME, null, contentValues); // result为-1表示插入失败,返回布尔值 return result != -1; } }
额外提示
- 数据库版本号修改后,旧表会被删除重建,若需要保留旧数据,需编写更完善的
onUpgrade数据迁移逻辑。 - 实际项目中不要明文存储密码,建议使用MD5、SHA-256等哈希算法加密后再存储。
- 可以添加更严谨的输入验证,比如邮箱格式检查、邮政编码格式检查等。
内容的提问来源于stack exchange,提问作者Timmy Ogden
相关产品推荐
相关产品推荐

