是什么导致以下java代码中的错误

问题描述 投票:-3回答:2

我已经实现了一个方法来针对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();
            }

        }
    });
}
}
java android sqlite
2个回答
2
投票

您将参数usernamepassword作为列名传递。 正确的方法是:

Cursor c = db.rawQuery(
    "SELECT * FROM users WHERE usenamecolumn = ? AND passwordcolumn = ?", 
     new String[] {username, password});

usenamecolumnpasswordcolumn更改为用户名和密码的表名列。


0
投票

你可能想要更接近这个:

    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?

希望这可以帮助。

© www.soinside.com 2019 - 2024. All rights reserved.