我已经实现了一个方法来针对SQLite数据库验证用户,但是当单击登录按钮时程序仍然会抛出错误错误代码如下
2019年4月15日21:38:27.455 4601-4601 / com.example.mymedicare E / AndroidRuntime:致命异常:主要过程:com.example.mymedicare,PID:4601 android.database.sqlite.SQLiteException:没有这样的柱:布拉德(码1):在编译:SELECT * FROM用户WHERE布拉德=?和Brad1994 =?在android.database.sqlite.SQLiteConnection.nativePrepareStatement(本机方法)在android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889)在android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500)在安卓.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)在android.database.sqlite.SQLiteProgram。(SQLiteProgram.java:58)在android.database.sqlite.SQLiteQuery。(SQLiteQuery.java:37)在机器人。 database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44)在android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1318)在android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1257)在COM .example.mymedicare.MyDBHelper.checkLogin(MyDBHelper.java:96)
我已经尝试阅读错误日志但找不到任何严重错误,我的方法将在下面显示
// This is my check login method in mydbhelper
public boolean checkLogin(String username, String password) {
SQLiteDatabase db = this.getWritableDatabase();
String s;
Cursor c = db.rawQuery("SELECT * FROM users WHERE " + username + " =? AND " + password + " =?", null);
if (c.getCount() <= 0) {
c.close();
db.close();
return false;
} else {
c.close();
db.close();
return true;
}
}
//This is LoggingIn activity where I have tried to implement the above
method
public class LoggingIn extends AppCompatActivity {
//defines page objects
private Button SignIn;
private EditText Usernames;
private EditText Passwords;
private MyDBHelper db;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_logging_in);
//Finds objects by ID
//edit text to string
Usernames = (EditText) findViewById(R.id.Usernames);
Passwords = (EditText) findViewById(R.id.Passwords);
Button SignIn = (Button) findViewById(R.id.SignIn);
db = new MyDBHelper(this);
SignIn.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View v) {
Boolean validUser =
db.checkLogin(Usernames.getText().toString(),
Passwords.getText().toString());
if (validUser == true) {
Intent i = new Intent(getApplicationContext(),
HomePage.class);
startActivity(i);
} else {
Toast.makeText(getApplicationContext(), "Invalid login",
Toast.LENGTH_SHORT).show();
}
}
});
}
}
您将参数username
和password
作为列名传递。
正确的方法是:
Cursor c = db.rawQuery(
"SELECT * FROM users WHERE usenamecolumn = ? AND passwordcolumn = ?",
new String[] {username, password});
将usenamecolumn
和passwordcolumn
更改为用户名和密码的表名列。
你可能想要更接近这个:
db.rawQuery("SELECT * FROM users WHERE username = ? AND password = ?", null);
在您编写上面的方式中,您尝试使用搜索条件(值)作为列名(键)来执行查询。
例如。用简单的英语,原始语句的第一部分说“在列Brad中找到一些东西”,这就是为什么你的异常会弹出“SQLiteException:no such column:Brad”
你真正想说的是“在列用户名中找到布拉德”,这就是我上面添加的修改后的声明应该为你做的(它没有经过测试,但是在正确的轨道上让你前进)。
我发现这个其他StackOverflow帖子也可能有助于创建预准备语句 - > How do I use prepared statements in SQlite in Android?
希望这可以帮助。