Связи сущностей в Android-комнате

Я пытаюсь загрузить сублимию сущности, но я бы хотел избежать 2 запросов.

Я думаю о запросе внутри TypeConverter, но я действительно не знаю, хорошая ли это идея.

Мои сущности:

@Entity class Region( @PrimaryKey(autoGenerate = true) var id: Int = 0, var name: String = "", var locales: List<Locale> = listOf()) @Entity(foreignKeys = arrayOf(ForeignKey( entity = Region::class, parentColumns = arrayOf("id"), childColumns = arrayOf("regionId"), onDelete = CASCADE, onUpdate = CASCADE ))) class Locale( @PrimaryKey(autoGenerate = true) var id: Int = 0, var regionId: Int = 0, var name: String = "") 

DAO:

 @Dao interface RoomRegionDao{ @Insert fun insert(region: Region) @Delete fun delete(region: Region) @Query("select * from region") fun selectAll(): Flowable<List<Region>> } @Dao interface RoomLocaleDao{ @Insert fun insert(locale: Locale) @Query("select * from locale where regionId = :arg0") fun selectAll(regionId: Int): List<Locale> } 

База данных:

 @Database(entities = arrayOf(Region::class, Locale::class), version = 1) @TypeConverters(RoomAppDatabase.Converters::class) abstract class RoomAppDatabase : RoomDatabase() { abstract fun regionDao(): RoomRegionDao abstract fun localeDao(): RoomLocaleDao inner class Converters { @TypeConverter fun toLocales(regionId: Int): List<Locale> { return localeDao().selectAll(regionId) } @TypeConverter fun fromLocales(locales: List<Locale>?): Int { locales ?: return 0 if (locales.isEmpty()) return 0 return locales.first().regionId } } } 

Он не работает, потому что не может использовать внутренний класс в качестве класса конвертера.

  • Это хороший способ?
  • Как я могу автоматически загружать «список локалей» в субъекте региона, когда я делаю RoomRegionDao.selectAll ?

Я думаю, что TypeConverter работает только для статических методов. Я говорю это на примере отсюда и здесь

Из раздела отношений здесь :

«Поскольку SQLite является реляционной базой данных, вы можете указать отношения между объектами. Хотя большинство библиотек ORM позволяют объектам объектов ссылаться друг на друга, Room явно запрещает это».

Поэтому я думаю, что лучше всего добавить @Ignore свойство your locales и сделать метод в RoomLocaleDao вставляет List<Locale> и вызывает его после вставки Region.

Метод, который вставляет Регион, может возвращать вставленный идентификатор .

Если метод @Insert получает только один параметр, он может возвращать длинный, который является новым rowId для вставленного элемента. Если параметр представляет собой массив или коллекцию, он должен возвращать long [] или List вместо этого. ( https://developer.android.com/topic/libraries/architecture/room.html#daos-convenience )