Допускает ли Room непримитивный тип данных в качестве первичного ключа?

Используя Room, я хочу написать Kotlin @Entity с непримитивным типом данных в качестве его @PrimaryKey. Например:

@Entity
data class MyEntity(
    @PrimaryKey val myType: MyType,
    val text: String
)

Я предоставляю TypeConverter между моим непримитивным типом в / из String.

class Converters {
    @TypeConverter fun fromString(value: String): MyType = MyTypeUtil.parse(value)
    @TypeConverter fun toString(myType: MyType) = myType.toString()
}

Я также правильно регистрирую свои TypeConverter в своей базе данных:

@Database(
    entities = [
        MyEntity::class
    ],
    version = 1
)
@TypeConverters(
    Converters::class
)
abstract class MyDatabase : RoomDatabase() {

    abstract fun myDao(): MyDao
}

Компиляция не выполняется:

...MyDao_Impl.java: uses unchecked or unsafe operations. Recompile with -Xlint:unchecked for details.

Вы можете помочь мне найти проблему? Разрешает ли Room то, что я пытаюсь сделать?

2
0
458
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Да - номер позволяет использовать непримитивные типы данных в качестве первичного ключа.

У вас есть ошибка в вашем TypeConverters - вы должны обеспечить преобразование из String в MyType и из MyType в String, поэтому метод fromString должен возвращать MyType (прямо сейчас он возвращает String). Измените это, и он должен работать :)
Если у вас по-прежнему возникают странные ошибки компиляции, попробуйте очистить проект после внесения изменений.

Прошу прощения - я неправильно набрал пример кода. Я отредактировал упомянутую вами сигнатурную ошибку. Я попробую ваше предложение в минимальном образце проекта, чтобы проверить исправление.

B W 02.05.2018 18:36

У меня есть кое-что, работающее в образце проекта с MyType как PrimaryKey. Я отчитаюсь после попытки исправить мой исходный проект. Спасибо!

B W 02.05.2018 18:53

У меня тоже кое-что работает в моем первоначальном проекте. Спасибо за вашу помощь!

B W 02.05.2018 19:06

Другие вопросы по теме