【问题标题】:Not able to retrieve data of a single row in room database by selecting it无法通过选择它来检索房间数据库中单行的数据
【发布时间】:2019-05-01 14:48:46
【问题描述】:

主要活动

myRoomDatabase3 = Room.databaseBuilder(getApplicationContext(),MyRoomDatabase.class,"messagedb3").fallbackToDestructiveMigration().allowMainThreadQueries().build();

Message message4 = new Message();
            message4.setTime("14:10");
            message4.setContactName("Deepika");
            message4.setDate("02-12-2018");
            message4.setMsg("HI");

            MainActivity.myRoomDatabase3.myDao().addMessage(message4);

            Toast.makeText(MainActivity.this,"Message added",Toast.LENGTH_SHORT).show();

MyDao 界面代码:-

import android.arch.persistence.room.Dao;
import android.arch.persistence.room.Insert;
import android.arch.persistence.room.Query;

@Dao
public interface MyDao {

@Insert
public void addMessage(Message message);

@Query("SELECT * FROM messages3 WHERE message_date LIKE :givenDate AND "  + "message_time LIKE :givenTime LIMIT 1")
public Message getMessageInfo(String givenDate,String givenTime);

}

我的消息类:-

import android.arch.persistence.room.ColumnInfo;
import android.arch.persistence.room.Entity;
import android.arch.persistence.room.PrimaryKey;

@Entity(tableName = "messages3")
public class Message {

@PrimaryKey(autoGenerate = true)
private int id;

@ColumnInfo(name = "message_date")
private String date;

@ColumnInfo(name = "message_time")
private String time;

@ColumnInfo(name = "message_contactName")
private String contactName;

@ColumnInfo(name = "message_msg")
private String msg;

public String getDate() {
    return date;
}

public void setDate(String date) {
    this.date = date;
}

public String getTime() {
    return time;
}

public void setTime(String time) {
    this.time = time;
}

public String getContactName() {
    return contactName;
}

public void setContactName(String contactName) {
    this.contactName = contactName;
}

public String getMsg() {
    return msg;
}

public void setMsg(String msg) {
    this.msg= msg;
}

public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

}

尝试从日期和时间为给定的数据库的一行中检索数据:-

Calendar calender = Calendar.getInstance();
    calender.set(Calendar.YEAR,2018);
    calender.set(Calendar.MONTH, 11);
    calender.set(Calendar.DAY_OF_MONTH, 02);
    SimpleDateFormat simpledateformat = new SimpleDateFormat("dd-MM-yyyy");
    String Date = simpledateformat.format(calender.getTime());

    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.HOUR_OF_DAY, 14);
    cal.set(Calendar.MINUTE, 10);
    cal.set(Calendar.SECOND,00);
    SimpleDateFormat simpletimeformat = new SimpleDateFormat("hh:mm");
    String Time = simpletimeformat.format(cal.getTime());

    Message message = MainActivity.myRoomDatabase3.myDao().getMessageInfo(Date,Time);

    String contactName = (message==null) ? "No data found" : message.getContactName();
    String text = (message == null) ? "No data found" : message.getMsg();

我的房间数据库类:-

import android.arch.persistence.room.Database;
import android.arch.persistence.room.RoomDatabase;


@Database(entities = {Message.class},version = 12,exportSchema = false)
public abstract class MyRoomDatabase extends RoomDatabase {

public abstract MyDao myDao();

}

我的 build.gradle 文件:-

allprojects {
repositories {
    google()
    jcenter()
}

}

依赖关系-

dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support:appcompat-v7:28.0.0-rc02'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'

implementation 'android.arch.persistence.room:runtime:1.0.0'
annotationProcessor 'android.arch.persistence.room:compiler:1.0.0'
}

如何消除错误?出了什么问题?如何通过从日期和时间字段中搜索来读取单行数据?

我已经添加了我正在使用的整个代码。请告诉我有什么问题。我被困在这个问题上 2-3 天。一定有问题。它是什么? 为什么查询返回null?

【问题讨论】:

  • 它又停止工作了!

标签: java android database android-studio android-room


【解决方案1】:

您的查询没有返回任何内容。所以消息为空。您需要确保您的查询返回某些内容或更好,添加代码以在未找到任何内容时处理这种情况,因为这似乎是一种合理的可能状态。

调试器可以比 SO 更快地给出相同的答案。

这将避免 NullPointerException:

String text = (message == null) ? “No data found.” : message.getMsg();

【讨论】:

  • 如何确保你的查询返回一些东西
  • 将满足您的 where 子句的数据放入数据库中或更改您的查询。我无法给你具体的答案,因为我不知道你的应用的业务逻辑。
  • 是否需要实现myDao接口并定义getMessageInfo()方法?
  • 没有。春天正在为你做这件事。确保数据在数据库中或防止调用代码中出现空值是您的工作。
  • 它已经开始工作,但后来我在 android studio 中创建了另一个项目并复制了其中的代码,因为我想对原始代码进行更改,但现在两个项目在 getMsg() 时再次开始返回 null叫。怎么办?
【解决方案2】:

如果您希望结果仅作为 Message 的单个记录,请使用以下查询:

SELECT * FROM messages WHERE message_date= :givenDate AND message_time= :givenTime LIMIT 1

现在,它将查询结果绑定到提供的消息对象。

【讨论】:

  • 它已经开始工作,但后来我在 android studio 中创建了另一个项目并复制了其中的代码,因为我想对原始代码进行更改,但现在两个项目在 getMsg() 时再次开始返回 null叫。怎么办?
  • 实际上,您获得的结果是基于您设备中可用的数据。所以,做一件事,首先保留满足您查询的适当数据,然后尝试检查那里的空值。
  • 我尝试简单地添加一些数据并使用房间检索它,即使这样也不起作用。
  • 应用程序在后台运行时给出正确的结果,但如果应用程序关闭并重新打开,则返回 null。如果应用被破坏,房间数据库是否会被破坏?
【解决方案3】:

我找到了,这是一个完全愚蠢的错误。 当我在数据库中输入信息时,我输入的时间是 14:10,但是当我尝试访问它时,我使用的是时间格式“hh:mm”而不是“HH:mm”所以我试图找到时间为 02:10 而不是 14:10 的列。这是两个不同的值,因此返回 null。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-10
    • 2021-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多