簡體   English   中英

查詢不使用 DAO 訪問 Room 數據庫,沒有錯誤

[英]Query not accessing a Room database using DAO, no errors

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

}

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

我相信您當前的問題是您試圖在可運行的內部運行可運行而不啟動內部可運行。

查詢很好,只是不需要 arguments(電子郵件和密碼)周圍的括號。 以下會很好: -

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

關於當前問題,您可能會發現在LoginActivity中對登錄按鈕的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();
            }
        }
    });

即只是一個可運行的。

如何存儲列表<object>在房間數據庫中? (我在使用 DAO 查詢檢索列表時遇到問題)<div id="text_translate"><p> 我將 Device 對象存儲在 Room 數據庫中,並且在檢索作為浮點列表的屬性 (temp_values) 之一時遇到問題。 我已經按照此處找到的其他建議說您需要一個類型轉換器,所以我在這里展示了。 當我嘗試編譯時,出現此錯誤:</p><blockquote><p> “警告:查詢返回 java.lang.Float 未使用的某些列 [temp_values]。您可以在字段上使用 @ColumnInfo 注釋來指定映射。您可以通過使用 @SuppressWarnings(RoomWarnings .CURSOR_MISMATCH)。查詢返回的列:temp_values。java.lang.Float 中的字段:。"</p></blockquote><p> 問題在於 DAO 中的 getTempValues 查詢,如果我將其注釋掉,那么一切都編譯得很好。 我在下面包含了設備 object、TemperatureListConverter 和我的 DAO。</p><pre> @Entity(tableName = "devices") @TypeConverters(TemperatureListConverter.class) public class Device implements Serializable { @PrimaryKey @NonNull @ColumnInfo(name = "serial_num") private String serialNum; @ColumnInfo(name = "temp_values") @TypeConverters(TemperatureListConverter.class) private List&lt;Float&gt; tempValues; public Device(String serialNum) { this.serialNum = serialNum; this.tempValues = new ArrayList&lt;&gt;(); } public String getSerialNum() { return serialNum; } public List&lt;Float&gt; getTempValues() { return tempValues; } public void setTempValues(List&lt;Float&gt; tempValues) { this.tempValues = tempValues; } }</pre><pre> public class TemperatureListConverter { private static final Gson gson = new Gson(); @TypeConverter public static List&lt;Float&gt; toTempList(String tempValuesString) { if (tempValuesString == null) { return Collections.emptyList(); } Type type = new TypeToken&lt;List&lt;Float&gt;&gt;() {}.getType(); return gson.fromJson(tempValuesString, type); } @TypeConverter public static String fromTempList(List&lt;Float&gt; tempValues) { return gson.toJson(tempValues); } }</pre><pre> @Dao @TypeConverters(TemperatureListConverter.class) public interface DeviceDao { @Query("SELECT * FROM devices") List&lt;Device&gt; getAllDevices(); @Query("SELECT * FROM devices WHERE serial_num =:serialNum") Device getDevice(String serialNum); @Query("SELECT temp_values FROM devices WHERE serial_num =:serialNum") List&lt;Float&gt; getTempValues(String serialNum); @Query("UPDATE devices SET temp_values =:tempValues WHERE serial_num =:serialNum") int setTempValues(String serialNum, List&lt;Float&gt; tempValues); @Insert void insert(Device... device); @Query("DELETE FROM devices WHERE serial_num =:serialNum") void deleteBySerial(String serialNum); }</pre><p> 編輯:我在這里添加了我的數據庫 class 。</p><pre> @Database(entities = {Device.class}, version = 37, exportSchema = false) @TypeConverters(TemperatureListConverter.class) public abstract class DeviceDatabase extends RoomDatabase { private static final String DB_NAME = "devices_db"; private static DeviceDatabase deviceDb; // simple singleton public static DeviceDatabase getDeviceDb(Context context) { if (deviceDb == null) { deviceDb = Room.databaseBuilder(context, DeviceDatabase.class, DB_NAME).fallbackToDestructiveMigration().build(); } return deviceDb; } public abstract DeviceDao getDeviceDao(); public void addDevice(final Device device) { new Thread(new Runnable() { @Override public void run() { try { getDeviceDao().insert(device); } catch (Exception e) { e.printStackTrace(); } } }).start(); } public void removeDevice(final String serialNum) { new Thread(new Runnable() { @Override public void run() { try { getDeviceDao().deleteBySerial(serialNum); } catch (Exception e) { e.printStackTrace(); } } }).start(); } public Device getDevice(final String serialNum) { final Device[] finalDevice = new Device[1]; Thread thread = new Thread(new Runnable() { @Override public void run() { try { finalDevice[0] = getDeviceDao().getDevice(serialNum); } catch (Exception e) { e.printStackTrace(); } } }); thread.start(); try { thread.join(); } catch (Exception e) { e.printStackTrace(); } return finalDevice[0]; } public List&lt;Float&gt; getTempValues(final String serialNum) { final List&lt;Float&gt; finalTempValues = new ArrayList&lt;&gt;(); Thread thread = new Thread(new Runnable() { @Override public void run() { try { finalTempValues.addAll(getDeviceDao().getTempValues(serialNum)); } catch (Exception e) { e.printStackTrace(); } } }); thread.start(); try { thread.join(); } catch (Exception e) { e.printStackTrace(); } return finalTempValues; } public void setTempValues(final String serialNum, final List&lt;Float&gt; tempValues) { new Thread(new Runnable() { @Override public void run() { try { getDeviceDao().setTempValues(serialNum, tempValues); } catch (Exception e) { e.printStackTrace(); } } }).start(); } }</pre></div></object>

[英]How to store List<Object> in Room database? (I'm having trouble retrieving the list with DAO query)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

相關問題 Dao 類中 Query 的房間數據庫問題 Dao Room 數據庫無法訪問 Room 數據庫 DAO 查詢到帶有 int 值的 SUM() 列並返回它......使用 MVM 模型 "Android Room Database:如何在 DAO @Query 中正確選擇“tableName”?" 如何存儲列表<object>在房間數據庫中? (我在使用 DAO 查詢檢索列表時遇到問題)<div id="text_translate"><p> 我將 Device 對象存儲在 Room 數據庫中,並且在檢索作為浮點列表的屬性 (temp_values) 之一時遇到問題。 我已經按照此處找到的其他建議說您需要一個類型轉換器,所以我在這里展示了。 當我嘗試編譯時,出現此錯誤:</p><blockquote><p> “警告:查詢返回 java.lang.Float 未使用的某些列 [temp_values]。您可以在字段上使用 @ColumnInfo 注釋來指定映射。您可以通過使用 @SuppressWarnings(RoomWarnings .CURSOR_MISMATCH)。查詢返回的列:temp_values。java.lang.Float 中的字段:。"</p></blockquote><p> 問題在於 DAO 中的 getTempValues 查詢,如果我將其注釋掉,那么一切都編譯得很好。 我在下面包含了設備 object、TemperatureListConverter 和我的 DAO。</p><pre> @Entity(tableName = "devices") @TypeConverters(TemperatureListConverter.class) public class Device implements Serializable { @PrimaryKey @NonNull @ColumnInfo(name = "serial_num") private String serialNum; @ColumnInfo(name = "temp_values") @TypeConverters(TemperatureListConverter.class) private List&lt;Float&gt; tempValues; public Device(String serialNum) { this.serialNum = serialNum; this.tempValues = new ArrayList&lt;&gt;(); } public String getSerialNum() { return serialNum; } public List&lt;Float&gt; getTempValues() { return tempValues; } public void setTempValues(List&lt;Float&gt; tempValues) { this.tempValues = tempValues; } }</pre><pre> public class TemperatureListConverter { private static final Gson gson = new Gson(); @TypeConverter public static List&lt;Float&gt; toTempList(String tempValuesString) { if (tempValuesString == null) { return Collections.emptyList(); } Type type = new TypeToken&lt;List&lt;Float&gt;&gt;() {}.getType(); return gson.fromJson(tempValuesString, type); } @TypeConverter public static String fromTempList(List&lt;Float&gt; tempValues) { return gson.toJson(tempValues); } }</pre><pre> @Dao @TypeConverters(TemperatureListConverter.class) public interface DeviceDao { @Query("SELECT * FROM devices") List&lt;Device&gt; getAllDevices(); @Query("SELECT * FROM devices WHERE serial_num =:serialNum") Device getDevice(String serialNum); @Query("SELECT temp_values FROM devices WHERE serial_num =:serialNum") List&lt;Float&gt; getTempValues(String serialNum); @Query("UPDATE devices SET temp_values =:tempValues WHERE serial_num =:serialNum") int setTempValues(String serialNum, List&lt;Float&gt; tempValues); @Insert void insert(Device... device); @Query("DELETE FROM devices WHERE serial_num =:serialNum") void deleteBySerial(String serialNum); }</pre><p> 編輯:我在這里添加了我的數據庫 class 。</p><pre> @Database(entities = {Device.class}, version = 37, exportSchema = false) @TypeConverters(TemperatureListConverter.class) public abstract class DeviceDatabase extends RoomDatabase { private static final String DB_NAME = "devices_db"; private static DeviceDatabase deviceDb; // simple singleton public static DeviceDatabase getDeviceDb(Context context) { if (deviceDb == null) { deviceDb = Room.databaseBuilder(context, DeviceDatabase.class, DB_NAME).fallbackToDestructiveMigration().build(); } return deviceDb; } public abstract DeviceDao getDeviceDao(); public void addDevice(final Device device) { new Thread(new Runnable() { @Override public void run() { try { getDeviceDao().insert(device); } catch (Exception e) { e.printStackTrace(); } } }).start(); } public void removeDevice(final String serialNum) { new Thread(new Runnable() { @Override public void run() { try { getDeviceDao().deleteBySerial(serialNum); } catch (Exception e) { e.printStackTrace(); } } }).start(); } public Device getDevice(final String serialNum) { final Device[] finalDevice = new Device[1]; Thread thread = new Thread(new Runnable() { @Override public void run() { try { finalDevice[0] = getDeviceDao().getDevice(serialNum); } catch (Exception e) { e.printStackTrace(); } } }); thread.start(); try { thread.join(); } catch (Exception e) { e.printStackTrace(); } return finalDevice[0]; } public List&lt;Float&gt; getTempValues(final String serialNum) { final List&lt;Float&gt; finalTempValues = new ArrayList&lt;&gt;(); Thread thread = new Thread(new Runnable() { @Override public void run() { try { finalTempValues.addAll(getDeviceDao().getTempValues(serialNum)); } catch (Exception e) { e.printStackTrace(); } } }); thread.start(); try { thread.join(); } catch (Exception e) { e.printStackTrace(); } return finalTempValues; } public void setTempValues(final String serialNum, final List&lt;Float&gt; tempValues) { new Thread(new Runnable() { @Override public void run() { try { getDeviceDao().setTempValues(serialNum, tempValues); } catch (Exception e) { e.printStackTrace(); } } }).start(); } }</pre></div></object> Room DAO 無法從數據庫檢索數據 會議室數據庫查詢 Room 數據庫實例無法解析 DAO 方法的符號 道室數據庫。 如何對所有金額求和並將其視為 TextView? 使用相同的方法恢復 Room 數據庫,但使用不同的 DAO
 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM