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; }
修复后验证步骤
- 卸载原有应用,清除旧数据库缓存
- 重新编译运行应用
- 完成注册流程,检查数据是否写入SQLite数据库
- 使用注册账号登录,验证是否正常跳转且无崩溃
内容的提问来源于stack exchange,提问作者Jad
相关产品推荐
相关产品推荐

