【问题标题】:SQLite check for duplicate usernameSQLite 检查重复的用户名
【发布时间】: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


    【解决方案1】:

    您的selection 不是一个表达式,也没有任何?,但您在selectionArgs 中有一个元素。

    您在checkDupUsername 中的查询应如下所示

    String query = "SELECT username FROM " + TABLE_USERS + " WHERE " + KEY_USERNAME + "=?";
    

    【讨论】:

    • omg 对不起,我整天都在做我的项目,完全错过了它。那是我的错,谢谢,现在这很明显,我很尴尬。该睡觉了
    【解决方案2】:

    而不是:-

    String query = "SELECT username FROM " + TABLE_USERS + " WHERE " + KEY_USERNAME;
    

    其中没有要绑定的参数(所以有0要绑定)

    你应该有:-

    String query = "SELECT username FROM " + TABLE_USERS + " WHERE " + KEY_USERNAME + "=?;
    

    Cursor cursor = db.rawQuery(query, new String[]{String.valueOf(username)} 行中的 new String[]{String.valueOf(username)} 中的 1 参数现在可以绑定替换 ?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-10
      • 2023-01-28
      • 2015-02-16
      • 1970-01-01
      相关资源
      最近更新 更多