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

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输入框的内容。

除此之外,还有两个隐藏的坑需要修复:

  1. 密码转Integer会崩溃:如果用户输入的密码包含非数字字符,Integer.parseInt()会直接抛出异常导致APP闪退。
  2. 参数与数据库字段不匹配:你的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:51:38