Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SQLite相关用户信息检索_Java_Android_Database_Sqlite - Fatal编程技术网

Java SQLite相关用户信息检索

Java SQLite相关用户信息检索,java,android,database,sqlite,Java,Android,Database,Sqlite,我正在使用SQLite数据库开发一个登录系统。我已经有了一个注册表单,它可以创建所有用户,我还创建了一个方法来检查输入EditText的用户名是否存在。但是现在我的问题是,你将如何从该用户那里检索所有相关信息,例如,我还需要检查该特定用户的密码是否匹配,我还需要从该用户那里检索数据库中的一些测试分数,然后将其显示在主页上。以下是用于登录用户的主活动中的代码: public void loginUser() { EditText usernameInput = findViewBy

我正在使用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;
        }
    }

可以实现这一点的方法之一是使用一个包含保存数据的变量的用户对象。这与进程不一致,而不是返回布尔值,将返回用户或null

也许考虑基于你的代码的演示应用程序,为了简洁起见,在数据库助手中包含一个用户类。 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方法,但如果找不到用户,则返回的用户对象将为null。
    • 使用完光标后,应将其关闭
    • 检查游标是否为null,如果它是由SQliteDatabase方法返回的,则该游标无效,因为如果该方法返回,则始终会返回有效的游标
    • Lilewise检查moveTofirst和光标计数是一种浪费,如果计数为0,moveTofirst将返回false,只需要一个检查
上述内容用于以下活动中,它反映了您现有的代码和您想要实现的目标

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

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();
        }
    }
}
public类MainActivity扩展了AppCompatActivity{
数据库助手dbHelper;
DatabaseHelper.User current\u User=null;
EditText loginUsername、loginPassword;
文本视图状态;
按钮登录;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
状态=this.findViewById(R.id.status);
loginUsername=this.findviewbyd(R.id.login\u用户名);
loginPassword=this.findviewbyd(R.id.login\u密码);
login=this.findviewbyd(R.id.login);
login.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
登录用户();
}
});
dbHelper=新的DatabaseHelper(此);
dbHelper.insertNewUser(“Admin”、“adminpassword”);
}
私有void登录用户(){
如果(
loginUsername.getText().toString()==null
||loginUsername.getText().toString().length()<1
||loginPassword.getText().toString()==null
||loginPassword.getText().toString().length()<1){
Toast.makeText(这是“字段不能为空”,Toast.LENGTH_SHORT).show();
返回;
}
if((当前用户=dbHelper.checkUser(loginUsername.getText().toString(),loginPassword.getText().toString())!=null){
loginUsername.setVisibility(View.GONE);
loginPassword.setVisibility(View.GONE);
login.setText(“dosomething”);
login.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
Toast.makeText(v.getContext(),“Hello”+
当前用户。getUserName()+
“您已登录以便可以执行某些操作!”,Toast.LENGTH\u SHORT.show();
}
});
status.setText(“以“+current_user.getUserName()的身份成功登录”);
}否则{
Toast.makeText(这是“不正确的用户名或密码”,Toast.LENGTH_SHORT).show();
}
}
}
结果 初次运行

  • 如果编辑文本中未插入任何内容,并且单击了登录按钮,则*字段不能为空消息将被烘烤
  • 如果输入了无效的用户和密码组合,并单击了“登录”按钮,则会显示错误的用户名或密码消息
  • 输入有效的用户名和密码,然后:-
    • topd处的文本变为成功登录为(其中???是用户名)
    • 用户名和密码的编辑文本将被删除
    • 登录按钮更改为按照以下步骤执行操作:-