#java #android #android-room #dao
Вопрос:
Эй, я новичок в Android и все еще учусь. Я занимаюсь проектом для университета. То, что я пытаюсь сделать, — это система входа/регистрации с использованием комнаты.
Страница регистрации работает нормально, генерирует базу данных и включает всех новых пользователей. Моя проблема заключается в том, что я проверяю наличие существующего пользователя на странице входа в систему.
После нажатия кнопки входа в систему приложение просто перестает работать, если ему нужно выполнить запрос. Профилировщик говорит, что приложение разбилось, хотя я все еще могу перемещаться по нему.
У меня нет ошибок в logcat или Run. Пожалуйста, скажите мне, что я делаю не так при доступе к базе данных. Если бы я мог увидеть хотя бы одну ошибку, я бы смог решить эту проблему.
Вот файлы java
RegisterActivity.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();
}
}
DatabaseClass.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);
}
LoginActivity.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);
}
}
При необходимости я предоставлю любую другую информацию.
Ответ №1:
Я полагаю, что ваша текущая проблема заключается в том, что вы пытаетесь запустить управляемый объект внутри управляемого объекта, не запуская внутренний управляемый объект.
Запрос в порядке, за исключением того, что нет необходимости в круглых скобках вокруг аргументов (адрес электронной почты и пароль). Следующее было бы прекрасно:-
@Query("SELECT * from user where email=:email and password=:password")
UserModel login(String email,String password);
В связи с текущей проблемой вы можете обнаружить, что использование следующего для 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();
}
}
});
то есть только один запускаемый.
Комментарии:
1. Это действительно решило мою проблему, спасибо.
2. @spaceTRT это хорошо. Если вы считаете, что ответ помог вам и является лучшим ответом, то вы можете рассмотреть возможность отметить Ответ как Ответ. Таким образом, Вопрос и Ответ становятся более заметными и потенциально более полезными.