【问题标题】:Android room select distinct table.calender from tableAndroid房间从表中选择不同的table.calendar
【发布时间】:2020-08-18 22:37:54
【问题描述】:

面临的问题是从表中获取日历字段。

我的实际数据类是:

@TypeConverters(CalendarConverters::class)
@Entity(tableName = MY_TABLE)
data class MyEpg(
    val updatedAt: Calendar,
    val epgName: String,
    val epgStartTime: Calendar,
    val epgEndTime: Calendar,
    @ColumnInfo(name = "calendar")
    val calendar: Calendar,
    val chName: String
) {
    @ColumnInfo(name = "id")
    @PrimaryKey(autoGenerate = true)
    var id: Long = 0
}

我使用类型转换器作为:

object CalendarConverters {
    @TypeConverter
    @JvmStatic
    fun fromTimestamp(value: Long?): Calendar? = value?.let { value ->
        GregorianCalendar().also { calendar ->
            calendar.timeInMillis = value
        }
    }

    @TypeConverter
    @JvmStatic
    fun toTimestamp(timestamp: Calendar?): Long? = timestamp?.timeInMillis
}

我使用的查询是:

 @Query("select distinct ${MY_TABLE}.calendar from $MY_TABLE order by ${MY_TABLE}.calendar asc")
 suspend fun getCalendars(): List<Calendar>

构建视图中显示的错误是

查询返回一些没有被使用的列 [日历] java.lang.对象。您可以在字段上使用 @ColumnInfo 注释 指定映射。您可以通过注释 使用@SuppressWarnings(RoomWarnings.CURSOR_MISMATCH) 的方法。列 查询返回:日历。 java.lang.Object 中的字段:. 公共抽象 java.lang.Object getCalendars(@org.jetbrains.annotations.NotNull()

错误:不确定如何将 Cursor 转换为此方法的返回类型 (java.lang.Object)。 公共抽象 java.lang.Object getCalendars(@org.jetbrains.annotations.NotNull()

注意: 我注意到正在使用转换为 long 的类型转换器,而从 long 转换为 date 没有被使用。

除了单个日历项之外,获取任何单个字段或完整对象都没有任何问题。

【问题讨论】:

  • 你能告诉我们你的实体类代码吗?我想你只需要通过添加 @ColumnInfo(name = "your name") 来定义你的列名
  • 添加了数据类,我也使用了 columnInfo

标签: android sqlite android-room


【解决方案1】:

我复制了您的代码,但没有收到该错误。不过,我有一些意见供您参考:

  1. 我注意到您使用 MY_TABLE 作为表名,但在查询中您使用带有“小写 y”的 My_TABLE。这是错字吗?

  2. 您可以通过将对象 CalendarConverters 替换为简单类来避免使用 @JvmStatic。对象适用于单例模式。

  3. 我认为原因可能是您在表 MyEpg 表中插入了无效数据,因此,当您使用查询执行请求时,列 calendar 包含空值。这可能是您收到下一个的原因:

error: Not sure how to convert a Cursor to this method's return type (java.lang.Object). public abstract java.lang.Object getCalendars(@org.jetbrains.annotations.NotNull()

您可以通过在返回类型中添加一个可为空的指示符来解决问题:

@Query("select distinct ${MY_TABLE}.calendar from $MY_TABLE order by ${MY_TABLE}.calendar asc")
 suspend fun getCalendars(): List<Calendar?>

【讨论】:

  • 不,我已经在问题中更改了它们,它们在项目实施中有所不同。让我试试 nullable
【解决方案2】:

也许您忘记应用您的 TypeConverter(或者选择了错误的位置来放置注释)?在您的情况下,有两种方法可以做到这一点:

  1. 在数据库级别应用它:

@Database(entities = arrayOf(YourEntity::class), version = 1) @TypeConverters(CalendarConverters::class) abstract class AppDatabase : RoomDatabase() { ...................

  1. 在实体级别应用它:

@Entity(tableName = "your_table") @TypeConverters(CalendarConverters::class) data class YourEntity (

和道层次:

@TypeConverters(CalendarConverters::class) suspend fun getCalendars(): List<Calendar>

【讨论】:

  • 我尝试在所有地方保留,但注意到正在使用转换为 long 的类型转换器,而从 long 转换为 date 没有被使用。
  • 这很奇怪。我尝试了您的情况,两种描述的变体都运行良好,没有任何错误消息
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-29
  • 1970-01-01
  • 1970-01-01
  • 2011-04-24
  • 2017-09-21
  • 1970-01-01
相关资源
最近更新 更多