【问题标题】:SQLite relevant user info retrievalSQLite 相关用户信息检索
【发布时间】:2019-11-22 23:08:52
【问题描述】:

我正在使用 SQLite 数据库开发登录系统。我已经有一个注册表单,它可以很好地创建所有用户,我还创建了一个方法来检查输入到 EditText 的用户名是否存在。但是现在我的问题是,您将如何从该用户那里检索所有相关信息,例如,我还需要检查该特定用户的密码是否匹配,并且我还需要从该用户那里检索一些测试成绩也在数据库中,然后将它们显示在主页中。这是用于登录用户的主要活动中的代码:

public void loginUser() {
        EditText usernameInput = findViewById(R.id.login_username);
        EditText passwordInput = findViewById(R.id.login_password);
        String loginUsername = usernameInput.getText().toString();
        String loginPassword = passwordInput.getText().toString();

        if(loginUsername.matches("") || loginPassword.matches("")) {
            Toast.makeText(this, "Fields cannot be empty", Toast.LENGTH_SHORT).show();
        } else {
            if (dbHelper.ifUserExists(loginUsername)) {
                //password verification and login
                //how to retrieve relevant users password and compare to password input?
            } else {
                Toast.makeText(this, "Incorrect username or password", Toast.LENGTH_SHORT).show();
            }
        }
    }

下面是 databaseHelper 中检查用户是否存在的方法:

public boolean ifUserExists(String user) {
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.query(TABLE_USERS,
                new String[]{KEY_ID, KEY_USERNAME, KEY_PASSWORD, KEY_SAT_READING, KEY_SAT_MATH, KEY_ACT_READING, KEY_ACT_MATH},
                KEY_USERNAME + "=?",
                new String[]{user},
                null, null, null);
        if(cursor != null && cursor.moveToFirst()&& cursor.getCount() > 0) {
            return true;
        } else {
            return false;
        }
    }

【问题讨论】:

    标签: java android database sqlite


    【解决方案1】:

    您可以处理此问题的多种方法之一是拥有一个包含保存数据的变量的用户对象。这种与进程的结合而不是返回布尔值会返回一个用户或空值。

    也许可以根据您的代码考虑这个演示应用程序,为简洁起见,在 Database Helper 中包含一个 User 类。

    DatabaseHelper.java :-

    public class DatabaseHelper extends SQLiteOpenHelper {
    
        public static final String DBNAME = "mydb";
        public static final int DBVERSION = 1;
        public static final String TABLE_USERS = "users";
        public static final String KEY_ID = BaseColumns._ID;
        public static final String KEY_USERNAME = "username";
        public static final String KEY_PASSWORD = "password";
        public static final String KEY_SAT_READING = "reading";
        public static final String KEY_SAT_MATH = "satmath";
        public static final String KEY_ACT_READING = "actreading";
        public static final String KEY_ACT_MATH = "actmath";
    
        SQLiteDatabase db;
    
        public DatabaseHelper(Context context) {
            super(context, DBNAME, null, DBVERSION);
            db = this.getWritableDatabase();
        }
    
        @Override
        public void onCreate(SQLiteDatabase db) {
            String users_crt_sql = "CREATE TABLE IF NOT EXISTS " + TABLE_USERS +
                    "(" +
                    KEY_ID + " INTEGER PRIMARY KEY," +
                    KEY_USERNAME + " TEXT UNIQUE," +
                    KEY_PASSWORD + " TEXT," +
                    KEY_SAT_READING + " TEXT," +
                    KEY_SAT_MATH + " TEXT," +
                    KEY_ACT_READING + " TEXT," +
                    KEY_ACT_MATH + " TEXT" +
                    ")";
            db.execSQL(users_crt_sql);
        }
    
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    
        }
    
        public long insertNewUser(String name, String password) {
            ContentValues cv = new ContentValues();
            cv.put(KEY_USERNAME,name);
            cv.put(KEY_PASSWORD,password);
            return db.insert(TABLE_USERS,null,cv);
        }
    
        public User checkUser(String name, String password) {
            User rv = null;
            Cursor csr = db.query(
                    TABLE_USERS,
                    null,
                    KEY_USERNAME + "=? AND " + KEY_PASSWORD + "=?",
                    new String[]{name,password},
                    null,null,null
            );
            if (csr.moveToFirst()) {
                rv = new User();
                rv.setUserId(csr.getLong(csr.getColumnIndex(KEY_ID)));
                rv.setUserName(name);
                rv.setUserPassword("");
                rv.setUserSatReading(csr.getString(csr.getColumnIndex(KEY_SAT_READING)));
                rv.setUserSatMath(csr.getString(csr.getColumnIndex(KEY_SAT_MATH)));
                rv.setUserActReading(csr.getString(csr.getColumnIndex(KEY_ACT_READING)));
                rv.setUserActMath(csr.getString(csr.getColumnIndex(KEY_ACT_MATH)));
            }
            csr.close();
            return rv;
        }
    
        public class User {
            long userId;
            String userName;
            String userPassword;
            String userSatReading;
            String userSatMath;
            String userActReading;
            String userActMath;
    
            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.userPassword = password;
                this.userSatReading = satReading;
                this.userSatMath = satMath;
                this.userActReading = actReading;
                this.userActMath = 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 getUserPassword() {
                return userPassword;
            }
    
            public void setUserPassword(String userPassword) {
                this.userPassword = userPassword;
            }
    
            public String getUserSatReading() {
                return userSatReading;
            }
    
            public void setUserSatReading(String userSatReading) {
                this.userSatReading = userSatReading;
            }
    
            public String getUserSatMath() {
                return userSatMath;
            }
    
            public void setUserSatMath(String userSatMath) {
                this.userSatMath = userSatMath;
            }
    
            public String getUserActReading() {
                return userActReading;
            }
    
            public void setUserActReading(String userActReading) {
                this.userActReading = userActReading;
            }
    
            public String getUserActMath() {
                return userActMath;
            }
    
            public void setUserActMath(String userActMath) {
                this.userActMath = userActMath;
            }
        }
    }
    
    • 请注意,checkUser 方法等效于您的 idUserExists 方法,但如果未找到用户,则返回的 User 对象将为 null。
      • 您应该在完成后关闭光标。
      • 检查游标是否为空,如果 SQliteDatabase 方法返回它是无用的,因为如果方法返回,将始终返回有效的游标。
      • Lilewise 检查 moveTofirst,如果计数为 0,则游标的计数是一种浪费 moveToFirst 将返回 false,仅需要其中一项检查。

    上面的内容在一个活动中使用,类似于以下内容,它反映了您现有的代码和您想要实现的目标。

    最初启动时,应用程序会添加一个用户(用于演示),用户名为 Admin,密码为 adminpassword。 UI 由一个显示未登录!!!!(显示屏顶部)的 textView、两个编辑文本(根据您的代码)和一个用于登录的按钮组成。

    MainActivity.java

    public class MainActivity extends AppCompatActivity {
    
        DatabaseHelper dbHelper;
        DatabaseHelper.User current_user = null;
        EditText loginUsername, loginPassword;
        TextView status;
        Button login;
    
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            status = this.findViewById(R.id.status);
            loginUsername = this.findViewById(R.id.login_username);
            loginPassword = this.findViewById(R.id.login_password);
            login = this.findViewById(R.id.login);
            login.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    loginUser();
                }
            });
    
            dbHelper = new DatabaseHelper(this);
            dbHelper.insertNewUser("Admin","adminpassword");
    
        }
    
        private void loginUser() {
            if (
                    loginUsername.getText().toString() == null
                            || loginUsername.getText().toString().length() < 1
                            ||loginPassword.getText().toString() == null
                            || loginPassword.getText().toString().length() < 1) {
                Toast.makeText(this, "Fields cannot be empty", Toast.LENGTH_SHORT).show();
                return;
            }
            if ((current_user = dbHelper.checkUser(loginUsername.getText().toString(),loginPassword.getText().toString())) != null) {
                loginUsername.setVisibility(View.GONE);
                loginPassword.setVisibility(View.GONE);
                login.setText("DO SOMETHNG");
                login.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Toast.makeText(v.getContext(),"Hello " +
                                current_user.getUserName() +
                                " you are logged in so you can do something!",Toast.LENGTH_SHORT).show();
                    }
                });
                status.setText("Successfully Logged-In as " + current_user.getUserName());
            } else {
                Toast.makeText(this, "Incorrect username or password", Toast.LENGTH_SHORT).show();
            }
        }
    }
    

    结果

    初始运行

    • 如果在任一编辑文本中均未输入任何内容,并且单击了 登录 按钮,则将显示 *Fields cannot be Empty 消息。
    • 如果输入了无效的用户和密码组合并单击了 登录 按钮,则会显示 不正确的用户名或密码 消息。
    • 然后输入有效的用户名和密码:-
      • topd 中的文本更改为 Successfully logged in as ????!!! (其中 ???? 是用户名) em>。
      • 删除了用户名和密码的编辑文本。
      • Login 按钮更改为 DO SOMETHING,如下所示:-

    【讨论】:

      猜你喜欢
      • 2016-06-04
      • 1970-01-01
      • 2013-09-16
      • 2019-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多