【问题标题】:SELECT query returns null though the object exist Kotlin\Room尽管对象存在 Kotlin\Room,但 SELECT 查询返回 null
【发布时间】:2019-03-27 19:10:06
【问题描述】:

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

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

报警(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)
}

AlarmRepository

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?

【问题讨论】:

  • 把你的仓库类也放上去
  • 添加了 repo 类代码

标签: android kotlin android-room dao


【解决方案1】:

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

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

第二。如果仍然无法使用,请确保您的 LiveData 运行良好。请记住,实时数据仅在对象更改时才起作用!这个问题可能存在问题,您可以手动将观察者附加到您的viewmodel。要测试这个问题,只需从返回类型中删除 LiveData 并再次检查即可。

【讨论】:

  • 你是对的。我刚刚删除了LiveData 并得到了错误Cannot access database on the main thread since it may potentially lock the UI for a long period of time.,然后我将getAlarm(id) 方法更改为通过Executors.newSingleThreadExecutor() 工作,一切正常!谢谢!附言如果可以的话,我会给你 +1(需要 8 个以上的声望才能做到这一点)。
猜你喜欢
  • 2020-07-25
  • 1970-01-01
  • 2016-03-22
  • 2019-05-05
  • 2018-03-09
  • 1970-01-01
  • 1970-01-01
  • 2016-03-22
  • 1970-01-01
相关资源
最近更新 更多