Android应用忘记密码Intent崩溃及登录DB查询异常求助
Android登录页崩溃及跳转问题修复
问题现象
- 登录页包含忘记密码、登录、注册三个按钮,注册功能的显式Intent可正常运行
- 点击忘记密码按钮时,应用先自动最小化,再次点击直接崩溃
- 输入正确用户名和密码执行登录操作时,应用崩溃
- 已知
ForgetPasswordPage.java中未对back控件执行findViewById初始化操作,可能是崩溃原因之一
相关代码片段
LoginPage.java - 忘记密码按钮逻辑
forgetpass.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(LoginPage.this,ForgetPasswordPage.class); startActivity(intent); } });
LoginPage.java - 登录按钮逻辑
signin.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String uname = username.getEditText().getText().toString(); String pass = password.getEditText().getText().toString(); if (dbHelper.checkUsername(uname)) { if (dbHelper.checkusernamePassword(uname,pass)) { Intent intent = new Intent(LoginPage.this, HomePage.class); startActivity(intent); }else { password.setError("Incorrect password"); } }else { username.setError("Username not found"); } } });
DBHelper.java - 数据库查询/更新逻辑
public boolean checkUsername (String username) { SQLiteDatabase db = this.getReadableDatabase(); Cursor cursor = db.rawQuery("SELECT * FROM users WHERE usnername = ?",new String[] {username}); if (cursor.getCount() > 0) return true; else return false; } public boolean checkusernamePassword (String username, String password) { SQLiteDatabase db = this.getReadableDatabase(); Cursor cursor = db.rawQuery("SELECT * FROM users WHERE usnername = ? and password = ?",new String[] {username,password}); if (cursor.getCount() > 0) return true; else return false; } public boolean changePassword (String username, String password) { SQLiteDatabase db = this.getWritableDatabase(); Cursor cursor = db.rawQuery("UPDATE users SET passwod = ? WHERE username = ?",new String[] {password,username}); if (cursor.getCount() > 0) return true; else return false; }
修复方案
1. 修复DBHelper中的拼写错误与逻辑错误
DBHelper中存在多处字段名拼写错误,以及错误使用rawQuery执行更新操作,这是登录崩溃的核心原因:
- 字段名拼写错误:
usnername应改为username,passwod应改为password - 更新操作错误:
rawQuery仅用于查询,执行UPDATE需使用update方法或execSQL,且需正确判断操作结果
修改后的DBHelper代码:
public boolean checkUsername(String username) { SQLiteDatabase db = this.getReadableDatabase(); // 修正字段名拼写错误:usnername -> username Cursor cursor = db.rawQuery("SELECT * FROM users WHERE username = ?", new String[]{username}); boolean exists = cursor.getCount() > 0; cursor.close(); // 关闭Cursor释放资源 db.close(); // 关闭数据库连接 return exists; } public boolean checkusernamePassword(String username, String password) { SQLiteDatabase db = this.getReadableDatabase(); // 修正字段名拼写错误:usnername -> username Cursor cursor = db.rawQuery("SELECT * FROM users WHERE username = ? and password = ?", new String[]{username, password}); boolean match = cursor.getCount() > 0; cursor.close(); db.close(); return match; } public boolean changePassword(String username, String password) { SQLiteDatabase db = this.getWritableDatabase(); ContentValues values = new ContentValues(); // 修正字段名拼写错误:passwod -> password values.put("password", password); // 使用update方法执行更新,返回受影响的行数 int rowsUpdated = db.update("users", values, "username = ?", new String[]{username}); db.close(); // 受影响行数>0说明修改成功 return rowsUpdated > 0; }
2. 初始化ForgetPasswordPage中的back控件
在ForgetPasswordPage.java的onCreate方法中添加back控件的初始化代码,避免空指针崩溃:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_forget_password); // 替换为你的back控件ID Button backBtn = findViewById(R.id.back_button); backBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { finish(); // 返回上一页 } }); }
3. 补充Activity注册检查
确保ForgetPasswordPage和HomePage已在AndroidManifest.xml中注册,避免跳转时崩溃:
<activity android:name=".ForgetPasswordPage"/> <activity android:name=".HomePage"/>
内容的提问来源于stack exchange,提问作者Harsh Kukadiya
相关产品推荐
相关产品推荐

