【发布时间】:2019-12-15 08:00:02
【问题描述】:
我想知道如何正确遍历整个用户名列并将编辑文本字符串与所有列进行比较,并且仅在匹配时才返回 true。我已经完成了一个注册系统,但它没有检查它应该做的重复用户名。所以我写了一个方法,但它似乎让我的应用程序崩溃这是崩溃消息:
java.lang.IllegalArgumentException: Cannot bind argument at index 1 because the index is out of range. The statement has 0 parameters.
显然,正如标题所示,我使用 SQLite 作为我的数据库。这是数据库代码:
public class DatabaseHelper extends SQLiteOpenHelper {
public static final int DATABASE_VERSION = 1;
public static final String DATABASE_NAME = "usersDB";
public static final String TABLE_USERS = "users";
public static final String KEY_ID = "_id";
public static final String KEY_USERNAME = "username";
public static final String KEY_PASSWORD = "password";
public static final String KEY_SAT_READING = "sat_reading";
public static final String KEY_SAT_MATH = "sat_math";
public static final String KEY_ACT_ENGLISH = "act_english";
public static final String KEY_ACT_MATH = "act_math";
private SQLiteDatabase db;
public DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
db = this.getWritableDatabase();
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE " + TABLE_USERS
+ "("
+ KEY_ID + " INTEGER PRIMARY KEY, "
+ KEY_USERNAME + " TEXT, "
+ KEY_PASSWORD + " TEXT, "
+ KEY_SAT_READING + " TEXT, "
+ KEY_SAT_MATH + " TEXT, "
+ KEY_ACT_ENGLISH + " TEXT, "
+ KEY_ACT_MATH + " TEXT "
+ ")"
);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE_USERS);
onCreate(db);
}
public User authenticate(String username, String password) {
User currentUser = null;
Cursor cursor = db.query(
TABLE_USERS,
null,
KEY_USERNAME + "=? AND " + KEY_PASSWORD + "=?",
new String[]{username, password},
null, null, null
);
if(cursor.moveToFirst()) {
currentUser = new User();
currentUser.setUserId(cursor.getLong(cursor.getColumnIndex(KEY_ID)));
currentUser.setUsername(username);
currentUser.setPassword("");
currentUser.setSatReading(cursor.getString(cursor.getColumnIndex(KEY_SAT_READING)));
currentUser.setSatMath(cursor.getString(cursor.getColumnIndex(KEY_SAT_MATH)));
currentUser.setActReading(cursor.getString(cursor.getColumnIndex(KEY_ACT_ENGLISH)));
currentUser.setActMath(cursor.getString(cursor.getColumnIndex(KEY_ACT_MATH)));
}
cursor.close();
return currentUser;
}
public Cursor getScores(String username, SQLiteDatabase db) {
String query = "SELECT sat_reading, sat_math, act_english, act_math FROM " + TABLE_USERS + " WHERE " + KEY_USERNAME + "=?";
Cursor cursor = db.rawQuery(query, new String[]{String.valueOf(username)});
return cursor;
}
public boolean checkDupUsername(String username, SQLiteDatabase db) { //The method I wrote to check for duplicates
String query = "SELECT username FROM " + TABLE_USERS + " WHERE " + KEY_USERNAME;
Cursor cursor = db.rawQuery(query, new String[]{String.valueOf(username)});
cursor.moveToFirst();
while(!cursor.isAfterLast()) {
if(username.matches(cursor.getString(0))) {
return true;
}
cursor.moveToNext();
}
cursor.close();
return false;
}
public class User {
public long userId;
public String username;
public String password;
public String satReading;
public String satMath;
public String actReading;
public String actMath;
public User() {
}
public User(String name, String password) {
this(-1L, name, password, null, null, null, null);
}
public User(long id, String name, String password, String satReading, String satMath, String actReading, String actMath) {
this.userId = id;
this.username = name;
this.password = password;
this.satReading = satReading;
this.satMath = satMath;
this.actReading = actReading;
this.actMath = actMath;
}
public long getUserId() {
return userId;
}
public void setUserId(long userId) {
this.userId = userId;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getSatReading() {
return satReading;
}
public void setSatReading(String satReading) {
this.satReading = satReading;
}
public String getSatMath() {
return satMath;
}
public void setSatMath(String satMath) {
this.satMath = satMath;
}
public String getActReading() {
return actReading;
}
public void setActReading(String actReading) {
this.actReading = actReading;
}
public String getActMath() {
return actMath;
}
public void setActMath(String actMath) {
this.actMath = actMath;
}
}
}
这里是注册活动本身,它使用方法newUser() 创建一个新用户并进行一系列检查
public class SignUp extends AppCompatActivity {
private DatabaseHelper dbHelper;
private LinearLayout rellay1;
private RelativeLayout rellay2;
private Handler handler = new Handler();
private Runnable runnable = new Runnable() {
@Override
public void run() {
rellay1.setVisibility(View.VISIBLE);
rellay2.setVisibility(View.VISIBLE);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sign_up);
rellay1 = findViewById(R.id.sign_up);
rellay2 = findViewById(R.id.signup_bottom_nav);
handler.postDelayed(runnable, 150);
Button createUser = findViewById(R.id.btn_signup);
createUser.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
newUser();
}
});
dbHelper = new DatabaseHelper(this);
Button clearAll = findViewById(R.id.btn_clear);
clearAll.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
clearDatabase();
}
});
}
public void clearDatabase() {
SQLiteDatabase database = dbHelper.getWritableDatabase();
database.delete(dbHelper.TABLE_USERS, null, null);
System.out.println("Database successfully cleared");
}
public void newUser() {
EditText usernameInput = findViewById(R.id.signup_username);
EditText passwordInput = findViewById(R.id.signup_password);
EditText confirmPasswordInput = findViewById(R.id.signup_confirtm_password);
EditText satScoreReadingInput = findViewById(R.id.signup_sat_reading);
EditText satScoreMathInput = findViewById(R.id.signup_sat_math);
EditText actScoreReadingInput = findViewById(R.id.signup_act_reading);
EditText actScoreMathInput = findViewById(R.id.signup_act_math);
String usersUsername = usernameInput.getText().toString();
String usersPassword = passwordInput.getText().toString();
String usersConfirmPassword = confirmPasswordInput.getText().toString();
String usersSatReadingScore = satScoreReadingInput.getText().toString();
String usersSatMathScore = satScoreMathInput.getText().toString();
String usersActReadingScore = actScoreReadingInput.getText().toString();
String usersActMathScore = actScoreMathInput.getText().toString();
SQLiteDatabase database = dbHelper.getReadableDatabase();
if(usersUsername.matches("") || usersPassword.matches("") || usersConfirmPassword.matches("") || usersSatReadingScore.matches("") || usersSatMathScore.matches("") || usersActReadingScore.matches("") || usersActMathScore.matches("")) {
Toast.makeText(this, "all fields are required", Toast.LENGTH_SHORT).show();
} else if(dbHelper.checkDupUsername(usersUsername, database)) { //this line crashes the app
Toast.makeText(this, "this username is unavailable", Toast.LENGTH_SHORT).show();
} else {
int satReadingScoreValue = Integer.parseInt(usersSatReadingScore);
int satMathScoreValue = Integer.parseInt(usersSatMathScore);
double actReadingScoreValue = Double.parseDouble(usersActReadingScore);
double actMathScoreValue = Double.parseDouble(usersActMathScore);
if(usersPassword.equals(usersConfirmPassword) && actReadingScoreValue < 36.1 && actMathScoreValue < 36.1 && satReadingScoreValue < 801 && satMathScoreValue < 801) {
ContentValues contentValues = new ContentValues();
contentValues.put(dbHelper.KEY_USERNAME, usersUsername);
contentValues.put(dbHelper.KEY_PASSWORD, usersPassword);
contentValues.put(dbHelper.KEY_SAT_READING, usersSatReadingScore);
contentValues.put(dbHelper.KEY_SAT_MATH, usersSatMathScore);
contentValues.put(dbHelper.KEY_ACT_ENGLISH, usersActReadingScore);
contentValues.put(dbHelper.KEY_ACT_MATH, usersActMathScore);
database.insert(dbHelper.TABLE_USERS, null, contentValues);
dbHelper.close();
Toast.makeText(this, "User " + usersUsername + " created", Toast.LENGTH_SHORT).show();
usernameInput.getText().clear();
passwordInput.getText().clear();
confirmPasswordInput.getText().clear();
satScoreReadingInput.getText().clear();
satScoreMathInput.getText().clear();
actScoreReadingInput.getText().clear();
actScoreMathInput.getText().clear();
} else {
Toast.makeText(this, "make sure password matches and test scores are within range", Toast.LENGTH_SHORT).show();
}
}
}
}
【问题讨论】:
标签: java android database sqlite