繁体   English   中英

Android 房间 select 从表中区分表。日历

[英]Android room select distinct table.calender from table

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

我的实际数据 class 是:

@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.Object 未使用的一些列 [日历]。 您可以在字段上使用 @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 的类型转换器。

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

我复制了您的代码,但没有收到该错误。 但是,我有一些观察要告诉你:

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

  2. 您可以通过将 object CalendarConverters 替换为简单的 class 来避免使用 @JvmStatic。 Object 适用于 singleton 模式。

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

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?>

也许您忘记了应用您的 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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM