如何使用 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
使用字符串参数并将 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)
你的代码的问题是不是你将参数作为整数传递(你没有),但参数不被识别为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 语句之前,您必须同时关闭 Cursor
和 db
对象。
我正在开发一个 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
使用字符串参数并将 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)
你的代码的问题是不是你将参数作为整数传递(你没有),但参数不被识别为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 语句之前,您必须同时关闭 Cursor
和 db
对象。