- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发一个使用 SQLite 数据库的登录系统。我已经有一个注册表单,它可以很好地创建所有用户,而且我还创建了一种方法来检查输入到 EditText 中的用户名是否存在。但现在我的问题是你将如何从该用户那里检索所有相关信息,例如我还需要检查该特定用户的密码是否匹配,我还需要从用户那里检索一些考试成绩也在数据库中,然后在主页上显示它们。这是用于登录用户的主要 Activity 中的代码:
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;
}
}
最佳答案
处理此问题的方法之一是拥有一个包含保存数据的变量的用户对象。这种与过程的结合而不是返回 boolean 值返回用户或 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;
}
}
}
以上内容用于以下内容的 Activity 中,它反射(reflect)了您现有的代码和您想要实现的目标。
应用程序最初启动时会添加一个名为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();
}
}
}
关于java - SQLite相关用户信息检索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59002935/
我正在编写一个具有以下签名的 Java 方法。 void Logger(Method method, Object[] args); 如果一个方法(例如 ABC() )调用此方法 Logger,它应该
我是 Java 新手。 我的问题是我的 Java 程序找不到我试图用作的图像文件一个 JButton。 (目前这段代码什么也没做,因为我只是得到了想要的外观第一的)。这是我的主课 代码: packag
好的,今天我在接受采访,我已经编写 Java 代码多年了。采访中说“Java 垃圾收集是一个棘手的问题,我有几个 friend 一直在努力弄清楚。你在这方面做得怎么样?”。她是想骗我吗?还是我的一生都
我的 friend 给了我一个谜语让我解开。它是这样的: There are 100 people. Each one of them, in his turn, does the following
如果我将使用 Java 5 代码的应用程序编译成字节码,生成的 .class 文件是否能够在 Java 1.4 下运行? 如果后者可以工作并且我正在尝试在我的 Java 1.4 应用程序中使用 Jav
有关于why Java doesn't support unsigned types的问题以及一些关于处理无符号类型的问题。我做了一些搜索,似乎 Scala 也不支持无符号数据类型。限制是Java和S
我只是想知道在一个 java 版本中生成的字节码是否可以在其他 java 版本上运行 最佳答案 通常,字节码无需修改即可在 较新 版本的 Java 上运行。它不会在旧版本上运行,除非您使用特殊参数 (
我有一个关于在命令提示符下执行 java 程序的基本问题。 在某些机器上我们需要指定 -cp 。 (类路径)同时执行java程序 (test为java文件名与.class文件存在于同一目录下) jav
我已经阅读 StackOverflow 有一段时间了,现在我才鼓起勇气提出问题。我今年 20 岁,目前在我的家乡(罗马尼亚克卢日-纳波卡)就读 IT 大学。足以介绍:D。 基本上,我有一家提供簿记应用
我有 public JSONObject parseXML(String xml) { JSONObject jsonObject = XML.toJSONObject(xml); r
我已经在 Java 中实现了带有动态类型的简单解释语言。不幸的是我遇到了以下问题。测试时如下代码: def main() { def ks = Map[[1, 2]].keySet()
一直提示输入 1 到 10 的数字 - 结果应将 st、rd、th 和 nd 添加到数字中。编写一个程序,提示用户输入 1 到 10 之间的任意整数,然后以序数形式显示该整数并附加后缀。 public
我有这个 DownloadFile.java 并按预期下载该文件: import java.io.*; import java.net.URL; public class DownloadFile {
我想在 GUI 上添加延迟。我放置了 2 个 for 循环,然后重新绘制了一个标签,但这 2 个 for 循环一个接一个地执行,并且标签被重新绘制到最后一个。 我能做什么? for(int i=0;
我正在对对象 Student 的列表项进行一些测试,但是我更喜欢在 java 类对象中创建硬编码列表,然后从那里提取数据,而不是连接到数据库并在结果集中选择记录。然而,自从我这样做以来已经很长时间了,
我知道对象创建分为三个部分: 声明 实例化 初始化 classA{} classB extends classA{} classA obj = new classB(1,1); 实例化 它必须使用
我有兴趣使用 GPRS 构建车辆跟踪系统。但是,我有一些问题要问以前做过此操作的人: GPRS 是最好的技术吗?人们意识到任何问题吗? 我计划使用 Java/Java EE - 有更好的技术吗? 如果
我可以通过递归方法反转数组,例如:数组={1,2,3,4,5} 数组结果={5,4,3,2,1}但我的结果是相同的数组,我不知道为什么,请帮助我。 public class Recursion { p
有这样的标准方式吗? 包括 Java源代码-测试代码- Ant 或 Maven联合单元持续集成(可能是巡航控制)ClearCase 版本控制工具部署到应用服务器 最后我希望有一个自动构建和集成环境。
我什至不知道这是否可能,我非常怀疑它是否可能,但如果可以,您能告诉我怎么做吗?我只是想知道如何从打印机打印一些文本。 有什么想法吗? 最佳答案 这里有更简单的事情。 import javax.swin
我是一名优秀的程序员,十分优秀!