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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 01:15:07