public User search(String username) {
SQLiteDatabase sdb = helper.getReadableDatabase();
Cursor cursor = sdb.rawQuery("SELECT * FROM user WHERE username=?", new String[]{username});
if (cursor.moveToFirst()) { // 若無資料返回 false,不會拋 NPE
String uname = cursor.getString(cursor.getColumnIndex("username"));
String pword = cursor.getString(cursor.getColumnIndex("password"));
User user = new User(uname, pword);
cursor.close();
return user;
}
cursor.close();
return null;
}
原提問者遇到 NPE,且建議改用 `cursor.next()`,**這是錯誤建議**。
public User search(String username) {
if (helper == null) {
Log.e(TAG, "DBHelper not initialized");
return null;
}
SQLiteDatabase db = null;
Cursor cursor = null;
try {
db = helper.getReadableDatabase();
cursor = db.rawQuery("SELECT username, password FROM user WHERE username=?", new String[]{username});
if (cursor != null && cursor.moveToFirst()) {
// 使用 getColumnIndexOrThrow 確保欄位存在
String uname = cursor.getString(cursor.getColumnIndexOrThrow("username"));
String pword = cursor.getString(cursor.getColumnIndexOrThrow("password"));
return new User(uname, pword);
}
return null;
} catch (SQLiteException e) {
Log.e(TAG, "Query failed", e);
return null;
} finally {
if (cursor != null) cursor.close();
// db 由 helper 管理,不需手動 close
}
}