问题描述
嘿,我是 Android 新手,仍在学习中。我在为大学做一个项目。
我想要做的是使用 Room 的登录/注册系统。
注册页面工作正常,生成数据库并包含任何新用户。我的问题是当我在登录页面上检查现有用户时。
按下登录按钮后,如果应用程序必须执行查询,它就会停止工作。 Profiler 说应用程序崩溃了,即使我仍然可以导航它。
我在 logcat 或 Run 中没有错误。请告诉我访问数据库时我做错了什么。如果我能看到至少一个错误,我就能解决问题。
这里是java文件
注册Activity.java
package com.example.spacetrt40;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import com.example.spacetrt40.EntityClass.usermodel;
public class Registeractivity extends AppCompatActivity {
EditText name,phone,password,email;
Button save,getData;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_register);
name=findViewById(R.id.etName);
email=findViewById(R.id.etMail);
phone=findViewById(R.id.etPhone);
password=findViewById(R.id.etPassword);
save=findViewById(R.id.btnReg2);
save.setonClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sendData();
}
});
}
private void sendData() {
String name_txt = name.getText().toString().trim();
String phone_txt = phone.getText().toString().trim();
String email_txt = email.getText().toString().trim();
String password_txt = password.getText().toString().trim();
usermodel model = new usermodel();
model.setName(name_txt);
model.setEmail(email_txt);
model.setPassword(password_txt);
model.setPhone(phone_txt);
DatabaseClass.getDatabase(getApplicationContext()).getDao().insertAllData(model);
Toast.makeText(this,"Data Successfully Saved",Toast.LENGTH_SHORT).show();
}
}
数据库类.java
package com.example.spacetrt40;
import android.content.Context;
import androidx.room.Database;
import androidx.room.Room;
import androidx.room.RoomDatabase;
import com.example.spacetrt40.EntityClass.usermodel;
@Database(entities = {usermodel.class},version = 1,exportSchema = false)
public abstract class DatabaseClass extends RoomDatabase {
public abstract DaoClass getDao();
private static DatabaseClass instance;
static DatabaseClass getDatabase(final Context context){
if (instance==null){
synchronized (DatabaseClass.class){
instance = Room.databaseBuilder(context,DatabaseClass.class,"DATABASE").allowMainThreadQueries().fallbackToDestructiveMigration().build();
}
}
return instance;
}
}
usermodel.java
import androidx.annotation.NonNull;
import androidx.room.ColumnInfo;
import androidx.room.Entity;
import androidx.room.PrimaryKey;
@Entity(tableName = "user")
public class usermodel {
public void setKey(int key) {
this.key = key;
}
@PrimaryKey(autoGenerate = true)
@NonNull
private int key;
@ColumnInfo(name = "name")
private String name;
@ColumnInfo(name = "email")
private String email;
@ColumnInfo(name = "phone")
private String phone;
@ColumnInfo(name = "password")
private String password;
public int getKey() {
return key;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getName() {
return name;
}
public String getPhone() {
return phone;
}
public String getpassword() {
return password;
}
public void setName(String name) {
this.name = name;
}
public void setPhone(String phone) {
this.phone = phone;
}
public void setPassword(String password) {
this.password = password;
}
}
DaoClass.java
package com.example.spacetrt40;
import androidx.room.Dao;
import androidx.room.Insert;
import androidx.room.Query;
import com.example.spacetrt40.EntityClass.usermodel;
import java.util.List;
@Dao
public interface DaoClass {
@Insert
void insertAllData(usermodel model);
//Select All Data
@Query("select * from user")
List<usermodel> getAllData();
@Query("SELECT * from user where email=(:email) and password=(:password)")
usermodel login(String email,String password);
}
登录Activity.java
package com.example.spacetrt40;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import com.example.spacetrt40.EntityClass.usermodel;
public class LoginActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
EditText user = findViewById(R.id.etUser);
EditText password = findViewById(R.id.etPass);
Button login = findViewById(R.id.button3);
login.setonClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String emailText = user.getText().toString();
String passwordText=password.getText().toString();
if (emailText.isEmpty()||passwordText.isEmpty()){
Toast.makeText(getApplicationContext(),"Fill in all Fields",Toast.LENGTH_LONG).show();
}else{
//perform query
DatabaseClass userDatabase = DatabaseClass.getDatabase(getApplicationContext());
new Thread(new Runnable() {
@Override
public void run() {
DaoClass daoClass = userDatabase.getDao();
new Thread((new Runnable() {
@Override
public void run() {
usermodel usermodel= daoClass.login(emailText,passwordText);
if (usermodel==null){
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(),"Invalid Credentials",Toast.LENGTH_LONG).show();
}
});
}else{
Intent in=new Intent(LoginActivity.this,MainActivity.class);
startActivity(in);
}
}
}));
}
}).start();
}
}
});
}
public void sendToReg(View v){
Button reg = findViewById(R.id.btnReg);
Intent in = new Intent(this,Registeractivity.class);
startActivity(in);
}
}
如果需要,我会提供任何其他信息。
解决方法
我相信您当前的问题是您试图在 runnable 内运行 runnable 而没有启动内部 runnable。
查询很好,只是参数(电子邮件和密码)周围不需要括号。以下就可以了:-
@Query("SELECT * from user where email=:email and password=:password")
UserModel login(String email,String password);
关于当前的问题,您可能会发现在 LoginActivity 中对 login 按钮的 onClickListener 使用以下内容会使您继续前进:-
login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String emailText = user.getText().toString();
String passwordText=password.getText().toString();
if (emailText.isEmpty()||passwordText.isEmpty()){
Toast.makeText(getApplicationContext(),"Fill in all Fields",Toast.LENGTH_LONG).show();
}else{
//perform query
DatabaseClass userDatabase = DatabaseClass.getDatabase(getApplicationContext());
new Thread(new Runnable() {
@Override
public void run() {
DaoClass daoClass = userDatabase.getDao();
UserModel userModel= daoClass.login(emailText,passwordText);
if (userModel==null){
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(),"Invalid Credentials",Toast.LENGTH_LONG).show();
}
});
}else{
Intent in=new Intent(LoginActivity.this,MainActivity.class);
startActivity(in);
}
}
}).start();
}
}
});
即只是一个可运行的。