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

Android Studio中SQLite表不存在错误及注册登录问题求助

问题排查与修复方案

核心错误分析

崩溃日志提示no such table: MEMBER,结合代码来看,核心问题是表名拼写不一致,同时存在字段名不匹配、空判断逻辑错误等多个小问题,导致数据无法写入数据库,登录时触发崩溃。


具体修复步骤

1. 修正DataBaseHelper类的关键错误

(1)表名与字段名统一

原代码中表名常量拼写为MEMEBER(少写一个B),登录查询却用MEMBER,同时查询语句硬编码字段名与数据库定义不匹配,统一修正为常量引用:

public class DataBaseHelper extends SQLiteOpenHelper {
    // 修正表名拼写为MEMBER
    public static final String MEMBER = "MEMBER";
    public static final String COLUMN_NAME = "Name";
    public static final String COLUMN_ID = "ID";
    public static final String COLUMN_EMAIL = "Email";
    public static final String COLUMN_PHONE = "Phone";
    public static final String COLUMN_DOB = "DOB";
    public static final String COLUMN_PASS = "Pass";

    public DataBaseHelper(@Nullable Context context) {
        super(context, "stpaul.db", null, 1);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        // 使用常量拼接建表语句
        db.execSQL( "CREATE TABLE " + MEMBER + " (" + COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + 
                COLUMN_NAME + " TEXT, " + COLUMN_EMAIL + " TEXT, " + COLUMN_PHONE + " INTEGER, " + 
                COLUMN_DOB + " TEXT, " + COLUMN_PASS + " TEXT )");
    }

    // 完善升级逻辑,版本更新时重建表
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS " + MEMBER);
        onCreate(db);
    }

    // 修正方法名拼写(原adddOne多一个d)
    public boolean addOne(CustomerModel customerModel){
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues cv = new ContentValues();
        cv.put(COLUMN_NAME, customerModel.getName());
        cv.put(COLUMN_EMAIL, customerModel.getEmail());
        cv.put(COLUMN_PHONE, customerModel.getPhone());
        cv.put(COLUMN_DOB, customerModel.getDOB());
        cv.put(COLUMN_PASS, customerModel.getPass());
        // 使用表名常量避免硬编码错误
        long insert = db.insert(MEMBER, null, cv);
        return insert != -1;
    }

    // 修正方法名与字段引用
    public Boolean checkUser(String username) {
        SQLiteDatabase db = this.getReadableDatabase(); // 查询用只读数据库即可
        Cursor cursor = db.rawQuery("SELECT * FROM " + MEMBER + " WHERE " + COLUMN_NAME + " = ?", 
                new String[] {username});
        boolean exists = cursor.getCount() > 0;
        cursor.close(); // 关闭Cursor防止内存泄漏
        return exists;
    }

    public Boolean checkPass(String username, String password) {
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.rawQuery("SELECT * FROM " + MEMBER + " WHERE " + COLUMN_NAME + " = ? AND " + COLUMN_PASS + " = ?", 
                new String[] {username, password});
        boolean exists = cursor.getCount() > 0;
        cursor.close();
        return exists;
    }
}

(2)关键优化点

  • 方法名符合命名规范:adddOne→addOne、checkuser→checkUser
  • 查询使用getReadableDatabase()减少资源消耗
  • 强制关闭Cursor避免内存泄漏
  • 补充onUpgrade逻辑,解决修改表结构后旧数据库不更新的问题

2. 修正注册Activity(SecondActivity)的错误

(1)空判断逻辑修复

原代码重复判断用户名,漏掉密码空检查,同时添加return阻止后续代码执行:

String user = editTextName.getText().toString();
String pass = editTextPassword.getText().toString();

if(user.isEmpty() || pass.isEmpty()) {
    Toast.makeText(SecondActivity.this, "请填写所有字段", Toast.LENGTH_LONG).show();
    return;
}

(2)Toast提示修复

原代码Toast.makeText()未调用show(),导致提示无法显示:

Toast.makeText(SecondActivity.this, customerModel.toString(), Toast.LENGTH_SHORT).show();
// 异常处理中的Toast同样补充show()
Toast.makeText(SecondActivity.this, "手机号格式错误", Toast.LENGTH_SHORT).show();

(3)异常处理优化

避免Integer.parseInt处理空字符串崩溃,添加格式判断:

try {
    String phoneStr = editTextPhone.getText().toString();
    int phone = phoneStr.isEmpty() ? 0 : Integer.parseInt(phoneStr);
    customerModel = new CustomerModel(-1, editTextName.getText().toString(), 
            editTextEmail.getText().toString(), phone, 
            editTextDateOfBirth.getText().toString(), 
            editTextPassword.getText().toString());
} catch(NumberFormatException e) {
    Toast.makeText(SecondActivity.this, "手机号格式错误", Toast.LENGTH_SHORT).show();
    customerModel = new CustomerModel(-1, "error", editTextEmail.getText().toString(), 
            0, editTextDateOfBirth.getText().toString(), 
            editTextPassword.getText().toString());
}

(4)移除冗余代码

登录链接点击事件无需获取所有输入字段,直接跳转即可:

tvLoginLink.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Intent intent = new Intent(SecondActivity.this, LoginActivity.class);
        startActivity(intent);
        finish();
    }
});

3. 修正登录Activity(LoginActivity)的错误

(1)空判断逻辑修复

和注册页面一样,修正重复判断用户名的问题:

String user = editTextUsername.getText().toString();
String pass = editTextPassword.getText().toString();

if(user.isEmpty() || pass.isEmpty()) {
    Toast.makeText(LoginActivity.this, "请填写所有字段", Toast.LENGTH_LONG).show();
    return;
}

修复后验证步骤

  1. 卸载原有应用,清除旧数据库缓存
  2. 重新编译运行应用
  3. 完成注册流程,检查数据是否写入SQLite数据库
  4. 使用注册账号登录,验证是否正常跳转且无崩溃

内容的提问来源于stack exchange,提问作者Jad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 11:57:03