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

问题描述

嘿,我是 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();
            }
        }
    });

即只是一个可运行的。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...