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

Query not accessing a Room database using DAO, no errors

嘿,我是 Android 的新手,仍在学习中。我正在为大学做一个项目。 我想做的是使用 Room 的 login/register 系统。

注册页面工作正常,生成数据库并包括任何新用户。我的问题是当我在登录页面上检查现有用户时。

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

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

这是 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);
    }

}

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

我认为您当前的问题是您正在尝试在 运行nable 中 运行 a 运行nable 而不启动内部 运行nable。

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

@Query("SELECT * from user where email=:email and password=:password")
UserModel login(String email,String password);

关于当前问题,您可能会发现 login 按钮的 onClickListener 中使用以下内容LoginActivity 让你继续:-

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

即只是一个 运行nable.