Android комната выбрать отдельный table.calender из таблицы - PullRequest
0 голосов
/ 04 мая 2020

Возникла проблема с получением поля календаря из таблицы.

Мой фактический класс данных:

@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:. publi c abstract java .lang.Object getCalendars (@ org.jetbrains.annotations.NotNull ()

ошибка: не уверен, как преобразовать курсор в тип возврата этого метода (java .lang) .Object). Publi c abstract java .lang.Object getCalendars (@ org.jetbrains.annotations.NotNull ()

Примечание. Я заметил этот преобразователь типов для преобразования в long используется, в то время как преобразование из long в date не используется.

Нет проблем при получении каких-либо отдельных полей или целого объекта, кроме одного элемента календаря.

Ответы [ 2 ]

1 голос
/ 09 мая 2020

Я воспроизвел ваш код, но я не получаю эту ошибку. Однако у меня есть несколько замечаний для вас:

  1. Я заметил, что в качестве имени таблицы вы используете MY_TABLE, но в запросе вы используете My_TABLE с "строчными буквами y". Это опечатка?

  2. Вы можете избежать использования @ JvmStati c, заменив объект CalendarConverters на простой класс. Объект работает с одноэлементным шаблоном.

  3. Я предполагаю, что причиной может быть то, что в таблицу MyEpg вставлены неверные данные, поэтому, когда вы делаете запрос, используя свой запрос , столбец календаря содержит нулевое значение. Это может быть причиной, по которой вы получаете следующее:

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?>
0 голосов
/ 05 мая 2020

Может быть, вы забыли применить свой TypeConverter (или выбрали неправильное место для размещения аннотации)? В вашем случае это можно сделать двумя способами:

  1. Применить его на уровне базы данных:

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

...