【问题标题】:Query not accessing a Room database using DAO, no errors查询不使用 DAO 访问 Room 数据库,没有错误
【发布时间】:2021-05-02 17:14:27
【问题描述】:

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

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

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

我在 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);
    }

}

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

【问题讨论】:

    标签: java android android-room dao


    【解决方案1】:

    我相信您当前的问题是您试图在 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();
                }
            }
        });
    

    即只是单个可运行文件。

    【讨论】:

    • 这确实解决了我的问题,谢谢。
    • @spaceTRT 很好。如果您认为答案对您有所帮助并且是给出的最佳答案,那么您可以考虑将答案打勾为答案。这样一来,问题和答案就变得更加突出,并且可能更有帮助。
    猜你喜欢
    • 1970-01-01
    • 2018-05-09
    • 1970-01-01
    • 2017-03-21
    • 1970-01-01
    • 1970-01-01
    • 2021-01-06
    • 2020-09-08
    • 2021-09-27
    相关资源
    最近更新 更多