Android应用:如何将EditText输入数据存入SQLite数据库
Android注册功能SQLite插入失败问题修复
问题概述
开发Android应用注册功能时,通过TextInputLayout嵌套的TextInputEditText收集用户账号、密码等信息,调用SQLite插入函数时失败,但使用硬编码数据调用该函数可正常插入。需要实现点击注册按钮时获取输入框数据并成功存入数据库。
错误分析
1. DBHelper插入方法未执行实际插入操作
原insertData方法仅构造了ContentValues,但未调用SQLite的插入API将数据写入数据库,且方法返回类型为void,却在Activity中被当作返回boolean的方法调用,导致逻辑错误。
2. 输入框数据获取时机错误
在onCreate生命周期中就获取输入框文本,此时用户尚未输入任何内容,拿到的是空字符串,插入空数据会触发主键约束(username为主键)导致插入失败。
修复步骤
修复DBHelper的insertData方法
修改方法返回类型为boolean,添加insert执行插入操作,并根据插入结果返回成功/失败状态:
package com.example.db; import android.content.ContentValues; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; public class DBHelper extends SQLiteOpenHelper { public static final String DBNAME = "login.db"; public DBHelper(Context context) { super(context, DBNAME, null, 1); } @Override public void onCreate(SQLiteDatabase db) { // 保留原表字段拼写:unsername db.execSQL("create TABLE users(unsername TEXT primary key,password TEXT,fullName TEXT,email TEXT,phone TEXT)"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("drop Table if exists users"); onCreate(db); } public boolean insertData(String username, String password, String fullName, String email,String phone) { SQLiteDatabase db = this.getWritableDatabase(); ContentValues contentValues = new ContentValues(); contentValues.put("unsername", username); contentValues.put("password", password); contentValues.put("fullName", fullName); contentValues.put("email", email); contentValues.put("phone", phone); // 执行插入,返回-1表示失败,否则成功 long result = db.insert("users", null, contentValues); db.close(); // 关闭数据库连接 return result != -1; } }
修复SignUpPage的数据获取逻辑
将输入框文本获取代码移至注册按钮的点击回调中,确保获取的是用户输入的最新数据:
package com.example.myapplication; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.ImageView; import android.widget.Toast; import androidx.activity.EdgeToEdge; import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityOptionsCompat; import androidx.core.util.Pair; import androidx.core.view.ViewCompat; import androidx.core.view.WindowInsetsCompat; import com.google.android.material.textfield.TextInputLayout; import com.example.db.DBHelper; public class SignUpPage extends AppCompatActivity { Button loginbtn, signupbtn; ImageView logo; TextInputLayout uname, pass, mail, phoneNo, fname; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); EdgeToEdge.enable(this); setContentView(R.layout.activity_sign_up_page); ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> { v.setPadding(insets.getInsets(WindowInsetsCompat.Type.systemBars()).left, insets.getInsets(WindowInsetsCompat.Type.systemBars()).top, insets.getInsets(WindowInsetsCompat.Type.systemBars()).right, insets.getInsets(WindowInsetsCompat.Type.systemBars()).bottom); return insets; }); // 初始化控件 loginbtn = findViewById(R.id.loginBtn); signupbtn = findViewById(R.id.signUpBtn); logo = findViewById(R.id.logo); uname = findViewById(R.id.username); pass = findViewById(R.id.pwd); phoneNo = findViewById(R.id.phone); mail = findViewById(R.id.email); fname = findViewById(R.id.name); DBHelper dbHelper = new DBHelper(this); loginbtn.setOnClickListener(v -> { Intent intent = new Intent(SignUpPage.this, LoginPage.class); Pair[] pair = new Pair[3]; pair[0] = new Pair<>(logo, "logo_img"); pair[1] = new Pair<>(loginbtn, "sign_up_in"); pair[2] = new Pair<>(signupbtn, "back_sign_up_in"); ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(SignUpPage.this, pair); startActivity(intent, options.toBundle()); }); signupbtn.setOnClickListener(v -> { // 点击按钮时才获取输入框数据 String username = uname.getEditText().getText().toString().trim(); String password = pass.getEditText().getText().toString().trim(); String fullName = fname.getEditText().getText().toString().trim(); String email = mail.getEditText().getText().toString().trim(); String phone = phoneNo.getEditText().getText().toString().trim(); // 简单非空校验 if (username.isEmpty() || password.isEmpty()) { Toast.makeText(SignUpPage.this, "账号和密码不能为空", Toast.LENGTH_SHORT).show(); return; } boolean isInserted = dbHelper.insertData(username, password, fullName, email, phone); if (isInserted) { Toast.makeText(SignUpPage.this, "注册成功", Toast.LENGTH_LONG).show(); } else { Toast.makeText(SignUpPage.this, "注册失败,账号可能已存在", Toast.LENGTH_LONG).show(); } }); } }
额外建议
- 统一数据库字段拼写:原代码中表字段为
unsername(少一个e),建议改为标准的username,修改时需同步建表语句和ContentValues中的键名。 - 增强输入校验:添加密码长度、邮箱格式、手机号格式等校验,提升数据有效性。
- 异常捕获:给数据库操作添加try-catch块,避免程序因SQLite异常崩溃。
内容的提问来源于stack exchange,提问作者Harsh Kukadiya
相关产品推荐
相关产品推荐

