[英]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.