[英]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 都没有任何问题。
我复制了您的代码,但没有收到该错误。 但是,我有一些观察要告诉你:
我注意到您使用 MY_TABLE 作为表名,但在查询中您使用带有“小写 y”的 My_TABLE。 这是一个错字吗?
您可以通过将 object CalendarConverters 替换为简单的 class 来避免使用 @JvmStatic。 Object 适用于 singleton 模式。
我假设原因可能是您在表 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(或者选择了错误的位置来放置注释)? 在您的情况下,有两种方法可以做到这一点:
@Database(entities = arrayOf(YourEntity::class), version = 1) @TypeConverters(CalendarConverters::class) abstract class AppDatabase: RoomDatabase() {...................
@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.