Entity Relationships in an Android Room

I am trying to load sublimation entities, but I would like to avoid 2 queries.

I'm going to make a request inside TypeConverter, but I really don't know if this is a good idea.

My objects:

@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 = "")

DAOs:

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

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

It does not work because it cannot use the inner class as a converter class.

  • Is this a good way?
  • How can I automatically load the “locale list” in a region object when I do RoomRegionDao.selectAll?
+4
source share
1 answer

I think that TypeConverteronly works for static methods. I say this with an example here and here

:

" SQLite , . ORM , Room ".

, , @Ignore locales RoomLocaleDao, List<Locale> .

, , .

@Insert , , rowId . , long [] List . (https://developer.android.com/topic/libraries/architecture/room.html#daos-convenience)

+3

Source: https://habr.com/ru/post/1678035/


All Articles