簡體   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