如何使用 android 找出用户是否存在于 Sqlite 数据库中?

How to find out user is present in Sqlite Database using android?

我正在开发一个 login/register 应用程序,只是为了培训,因为我是初学者,一切正常,除了一个小问题,但我不知道如何解决,我尝试搜索但无法解决找到任何东西 这是我的 database.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.onClick(MainActivity.kt:49)

我也不确定你为什么要关闭光标。 提前谢谢你

最终查询应该如下所示

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

用单引号括起您的用户名和密码。

你的问题是你的用户和传递变量是 String 你必须把你的字符串变量

变成" " or ' '

但是你把它们写成 Integer 而你的 table 列(user 和 pass)不是 Integer 而它们是 String

使用字符串参数并将 userpass 变量放入其中。 它将帮助您解决问题。

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)

你的代码的问题是不是你将参数作为整数传递(你没有),但参数不被识别为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 injection.
在此之后和 return 语句之前,您必须同时关闭 Cursordb 对象。