Запрос не обращается к базе данных номеров с помощью DAO, ошибок нет

#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 это хорошо. Если вы считаете, что ответ помог вам и является лучшим ответом, то вы можете рассмотреть возможность отметить Ответ как Ответ. Таким образом, Вопрос и Ответ становятся более заметными и потенциально более полезными.