Как узнать, что пользователь присутствует в базе данных Sqlite с помощью Android? - PullRequest
0 голосов
/ 29 сентября 2019

Я работаю над приложением для входа в систему / регистрации только для обучения, так как я новичок, все работает, за исключением небольшой проблемы, но я не знаю, как ее исправить, я попытался найти, но здесь ничего не нашел,часть моей базы данных .kt

   fun userPresent (user: String,pass: String):Boolean {
       val db = writableDatabase
       val query = "select * from $TABLE_NAME where username = $user and password = $pass"
       val cursor = db.rawQuery(query,null)

       if (cursor.count <= 0) {
           cursor.close()
           return false }
       cursor.close()
       return true }

mainactivity.kt

if (database.userPresent(user = username,pass = password)) {
                intent.putExtra("text", "Welcome , $username $password")
                startActivity(intent)
                Toast.makeText(this,"Logged In Successfully",Toast.LENGTH_SHORT).show()
            } else {
                Toast.makeText(this,"Wrong Username/Password",Toast.LENGTH_SHORT).show()
            }

Мой logCat Ошибка

android.database.sqlite.SQLiteException: no such column: ss (code 1 SQLITE_ERROR): , while compiling: select * from user_table where username = ss and password = ss
at com.example.myapplication.DatabaseHelper.userPresent(DatabaseHelper.kt:52)
at com.example.myapplication.MainActivity$onCreate$1.onClick(MainActivity.kt:49)

также я не уверен, почему вы должнызакройте курсор.заранее спасибо

Ответы [ 3 ]

3 голосов
/ 29 сентября 2019

Проблема с вашим кодом состоит в том, что не , что вы передаете аргументы как целое число (вы этого не делаете), но аргументы не распознаются как литералы TEXT, потому что они не заключены в одинарные кавычкиSQLite считает, что это имена столбцов.

Рекомендуемый способ передачи параметров в rawQuery() следующий:

fun userPresent (user: String, pass: String): Boolean {
    val db = writableDatabase 
    val query = "select * from $TABLE_NAME where username = ? and password = ?"
    val cursor = db.rawQuery(query, arrayOf(user, pass))
    val result = cursor.count > 0
    cursor.close()
    db.close()
    return result
}

Заполнители ? будут принимать свои значения из соответствующих элементов массива, переданного в качестве второго аргументаrawQuery(), и вам не нужно объединять одинарные кавычки, чтобы избежать риска sql внедрения .После этого и перед оператором return вы должны закрыть оба объекта Cursor и db.

2 голосов
/ 29 сентября 2019

Ваша проблема в том, что ваши пользовательские и пассивные переменные String , и вы должны поместить свои строковые переменные

в "" или ''

Но вы помещаете их как Целое число , в то время как столбцы таблицы (пользователь и пароль) не являются целыми числами и являются String

Используйте аргументы Stringи поместите в него переменные user и pass.Это поможет вам решить вашу проблему.

val query="select * from $TABLE_NAME where username =? and password = ?"
val arguments= arrayOf(user, pass)
db.rawQuery(query, arguments)

Конечно, как Второй способ вы можете попробовать это тоже

val query="select * from $TABLE_NAME where username = \'$user\' and password = \'$pass\'"
db.rawQuery(query, null)
0 голосов
/ 29 сентября 2019

Окончательный запрос должен выглядеть примерно так:

select * from user_table where username = 'ss' and password = 'ss';

Оберните имя пользователя и пароль одинарными кавычками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...