android - 尽管对象存在 Kotlin\Room,SELECT 查询返回 null

标签 android kotlin android-room dao

我正在尝试使用 Rooms 构建闹钟应用。我的方法 repository.getAlarmById(1) 返回 null。但是repository.getAlarms()输出

Alarm(id=1, min=12, hour=12, enabled=true, isRepeating=true)

Alarm(id=2, min=13, hour=13, enabled=true, isRepeating=true)

这是AlarmDao

@Dao
interface AlarmDao {

    @Query("SELECT * FROM alarm_table")
    fun getAll(): LiveData<List<Alarm>>

    @Query("SELECT * FROM alarm_table WHERE id = :id")
    fun getById(id: Int): LiveData<Alarm>

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun insert(alarm: Alarm)

    @Delete
    fun delete(alarm: Alarm)
}

报警库

class AlarmRepository (private val alarmDao: AlarmDao): AlarmDataSource {

    override fun getAlarms(): LiveData<List<Alarm>> {
        return alarmDao.getAll()
    }

    override fun getAlarm(id: Int): LiveData<Alarm> {
        return alarmDao.getById(id)
    }

    override fun saveAlarm(alarm: Alarm) {
        doAsync { alarmDao.insert(alarm) }
    }

    override fun deleteAlarm(alarm: Alarm) {
        doAsync { alarmDao.delete(alarm) }
    }
}

报警

@Entity(tableName = "alarm_table")
data class Alarm(
        @PrimaryKey
        var id: Int = 0,

        @ColumnInfo(name = "min")
        var min: Int = -1,

        @ColumnInfo(name = "hour")
        var hour: Int = -1,

        @ColumnInfo(name = "enabled")
        var enabled: Boolean = true,

        @ColumnInfo(name = "isRepeating")
        var isRepeating: Boolean = false )

为什么我总是得到 null?

最佳答案

您的代码似乎没问题。我的建议是检查两件事。

首先。将 LIMITED 1 添加到您的查询并检查它

其次。如果仍然不工作,请确保您的 LiveData 工作正常。请记住,实时数据仅在对象更改时才起作用!此问题可能存在问题,您可以手动将观察者附加到您的 viewmodel。要测试此问题,只需从返回类型中删除 LiveData 并再次检查即可。

关于android - 尽管对象存在 Kotlin\Room,SELECT 查询返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55384842/

相关文章:

java - 如何在android中创建年龄计算方法的方法

javascript - 如何确定 HTML 元素何时在 Android WebView 中获得焦点?

java - 包含的 ListView 不会填充

Android 空线性布局内容

android - 使用 Powermock2 和 Kotlin 模拟静态类

Android BluetoothDevice 读取新数据

android - 如何在不使用 SELECT 查询的情况下获取 Room 持久数据库中具有 bool 值 true(或 1)的行数?

ios - Kotlin / native : Can someone help me in suggesting how to create a frozen singleton that takes in init parameters?

android - 使用异步和等待从房间数据库获取数据

android - 为什么在带有 Kotlin 的 Android Studio 中使用 async{} 后我得到 LiveData 的空值?