Room — ORM для SQLite базы данных. Преимущества:

Пример использования:

1. Объект, описывающий структуру таблицы cinema

@Entity(tableName = "cinema")
data class CinemaScheme(
        @PrimaryKey @ColumnInfo(name = "cinema_id") val id: Long,
        @ColumnInfo(name = "name") val name: String,
        @ColumnInfo(name = "mail") val mail: String,
        @ColumnInfo(name = "address") val address: String,
        @ColumnInfo(name = "latitude") val latitude: Double,
        @ColumnInfo(name = "longitude") val longitude: Double,
        @ColumnInfo(name = "city_id") val cityId: Long,
        @ColumnInfo(name = "is_favorite") val isFavorite: Boolean,
        @ColumnInfo(name = "subway_stations") val stations: Array<DataSubwayStation>?) {
}

2. Data Access Object (Dao) для работы с таблицей cinema

@Dao
interface CinemaDao {
    @Query("SELECT * FROM cinema WHERE city_id = :cityId")
    fun subscribeToAllByCity(cityId: Long): Flowable<List<CinemaScheme>>

    @Query("SELECT * FROM cinema WHERE city_id = :cityId")
    fun getAllByCity(cityId: Long): Single<List<CinemaScheme>>

    @Query("SELECT * FROM cinema WHERE cinema_id = :cinemaId")
    fun getCinema(cinemaId: Long): Single<CinemaScheme>

    @Insert(onConflict = OnConflictStrategy.IGNORE)
    fun saveCinemas(items: List<CinemaScheme>)
}

3. Подключение Room в проект

@Module
class DataBaseModule {

    @Provides
    @ApplicationScope
    fun provideProjectDataBase(application: Application): ProjectDataBase {
        return Room.databaseBuilder(application, ProjectDataBase::class.java, "kinogolic-database").build()
    }

    @Provides
    @ApplicationScope
    fun provideCinemaDao(database: ProjectDataBase) = database.cinemaDao()

}

Настройка работы Room с базой данных в приложении осуществляется в DataBaseModule, который инклюдится в DataModule

@Database(entities = arrayOf(CityScheme::class, CinemaScheme::class), version = 2, exportSchema = false)
@TypeConverters(Converters::class)
abstract class ProjectDataBase : RoomDatabase() {
    abstract fun cinemaDao(): CinemaDao
}

После объект интерфейса CinemaDao используется как поле в CinemaRepository.