查询未使用DAO访问Room数据库,没有错误



嘿,我是安卓系统的新手,还在学习。我正在为大学做一个项目。我想做的是使用Room的登录/注册系统

"注册"页面运行良好,生成数据库并包括任何新用户。我的问题是当我在登录页面上检查现有用户时

按下登录按钮后,如果必须执行查询,应用程序就会停止工作。Profiler说应用程序崩溃了,尽管我仍然可以导航它。

我在logcat或Run中没有错误。请告诉我访问数据库时做错了什么。如果我能看到至少一个错误,我就能解决这个问题。

以下是java文件

注册活动.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;
}
}

用户模型.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);

}

登录活动.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);
}
}

如果需要,我将提供任何其他信息。

我认为您当前的问题是,您试图在不启动内部可运行程序的情况下在可运行程序内部运行可运行程序。

该查询很好,只是不需要在参数(电子邮件和密码(周围加括号。以下内容即可:-

@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();
}
}
});

即仅单个可运行。

相关内容

最新更新