我正在 AndroidStudio 上制作应用程序,我需要在他们登录应用程序时验证凭据。该应用程序使用 API 并验证凭据,我在数据库中创建了此函数以检查某人的电子邮件和密码: (postgresql)
create or replace function login (emailf text, passwordf text)
returns boolean
language plpgsql
as
$$
declare pp text;
begin
pp = (select pass_w from utilizador where utilizador.email = emailf);
if (pp = passwordf) then return true;
else return false;
end if; end
$$
我正在通过这个 CheckLoginas 函数解析数据:
var bola: Boolean? = null
fun CheckLoginas(c: Context?, email: String, pass: String): Boolean? {
var mQueue: RequestQueue
mQueue = Volley.newRequestQueue(c);
var url = "https://myurl.com" + "/utilizador/login/" + email + "/" + pass
val request = JsonArrayRequest(Request.Method.GET, url, null, Response.Listener {
response ->try {
var jsonArray = JSONArray()
jsonArray = response.getJSONArray(0)
for (i in 0 until jsonArray.length())
{
val jsonObject : JSONObject? = jsonArray.getJSONObject(i)
//val user = jsonArray.getJSONObject(i)
//val bool = jsonObject.getBoolean("login")
val boo : Boolean = jsonObject!!.getBoolean("login")
println("im inside CheckLoginas boo $boo\n\n")
bola = boo
}
} catch (e: JSONException) {
e.printStackTrace()
}
}, Response.ErrorListener { error -> error.printStackTrace() })
mQueue?.add(request)
return bola
}
'bola' 变量是一个全局变量,因为我需要从函数中返回一个布尔值,这样我才能知道凭据是否在另一个活动中检查(或不检查)。
问题:
要在凭据正确时登录,我必须在登录按钮中按两次。如果电子邮件和密码正确,我第一次按下它会给我“错误的凭据”错误,第二次它登录。我已经尝试用一段时间()来做到这一点,我一步一步地检查它并看起来很好,似乎没有任何方法可以解决此错误...该功能有效,API 也有效,应用程序本身也有效,它只是有单击按钮两次的错误...这是活动代码:
package com.example.crowdzero
import CheckLoginas
import Database
import android.content.Intent
import android.os.Bundle
import android.view.View.OnFocusChangeListener
import android.widget.Button
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import com.google.android.material.textfield.TextInputLayout
import java.lang.Thread.sleep
class Login : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_login)
val log_in_btn_log_in = findViewById<Button>(R.id.log_in_btn_log_in)
val log_in_btn_registar = findViewById<Button>(R.id.log_in_btn_registar)
log_in_btn_log_in.setOnClickListener {
verificacao()
}
log_in_btn_registar.setOnClickListener {
val intent = Intent(this, Registo::class.java)
startActivity(intent)
}
}
private fun verificacao() {
val log_in_input_text_email = findViewById<TextInputLayout>(R.id.log_in_input_text_email)
val log_in_input_text_password = findViewById<TextInputLayout>(R.id.log_in_input_text_password)
val string_email = log_in_input_text_email?.getEditText()?.getText().toString()?.trim()
val string_password = log_in_input_text_password?.getEditText()?.getText().toString()?.trim()
if (string_email.isNullOrEmpty())
{
log_in_input_text_email.setError(" ")
}
else if (string_password.isNullOrEmpty())
{
log_in_input_text_password.setError(" ")
}
else
{
val email = log_in_input_text_email.editText?.text.toString()
val password = log_in_input_text_password.editText?.text.toString()
//var baca = CheckLoginas(this,email,password)
println(email)
println(password)
var baca: Boolean? = null
baca = CheckLoginas(this, email, password)
//baca = CheckLoginas(this,email,password)
if (baca == false) {
//Toast.makeText(this, "Esta conta não está registada", Toast.LENGTH_SHORT).show();
println("Im inside if in login baca $baca")
} else if (baca == true) {
Toast.makeText(this, email, Toast.LENGTH_SHORT).show();
Toast.makeText(this, password, Toast.LENGTH_SHORT).show();
val intent = Intent(this, Home::class.java)
startActivity(intent)
finish()
}
}
}
}
当我使用数据库中的实际电子邮件和密码进行测试时,baca 变量在应该为真时保持为假,因为 CheckLoginas boo var 为真。这就是导致问题的原因。 image that shows it
我对数据库-API-应用程序还很陌生,所以如果它是一件微不足道的事情,请原谅我
答案 0 :(得分:0)
您正在呼叫 baca = CheckLoginas(this, email, password)
baca 不会立即更新,下一行 if (baca == false)
将在您的 API 响应到达之前执行,因此在您收到一些响应后,baca 变为 true。这就是您需要点击两次的原因。
答案 1 :(得分:0)
已解决:
我几乎在 login.kt 文件中插入了 CheckLoginas 函数。它现在有效!现在看起来像这样:
[^]