Есть ли опыт работы с Room

Ответ

Да, есть. Room — это ORM-библиотека для работы с SQLite в Android. Она упрощает работу с БД, предоставляя абстракции над SQL-запросами через аннотации.

Основные компоненты:

  • @Entity — класс таблицы.
  • @Dao (Data Access Object) — интерфейс для CRUD-операций.
  • @Database — абстрактный класс, наследующий RoomDatabase.

Пример:

@Entity
data class User(
    @PrimaryKey val id: Int,
    val name: String
)

@Dao
interface UserDao {
    @Query("SELECT * FROM user")
    fun getAll(): List<User>

    @Insert
    fun insert(user: User)
}

@Database(entities = [User::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
    abstract fun userDao(): UserDao
}

Нюансы:

  • Миграции через Migration.
  • Асинхронные запросы с LiveData/Flow.
  • Тестирование через inMemoryDatabaseBuilder.

Ответ 18+ 🔞

Э, слушай, а есть вообще что-то вменяемое для работы с базой на андроиде? Ну, чтобы не писать эти бесконечные CREATE TABLE и не ебаться с курсорами, как будто на дворе 2002-й год.

А, ну да, есть же Room! Это такая ORM-библиотека, которая поверх SQLite работает. По сути, она делает всю грязную работу за тебя: пишешь на Котлине, а она уже сама SQL-запросы генерирует. Удобно, блядь, как швейцарский нож.

Из чего эта штука, бля, состоит:

  • @Entity — это просто класс, который таблицу описывает. Объявил — и всё, таблица готова.
  • @Dao (Data Access Object) — интерфейс, где ты пишешь, что хочешь сделать с данными: вставить, выбрать, удалить. Всё через аннотации, нихуя самому не надо.
  • @Database — главный абстрактный класс, который всё это связывает в одну кучу. Наследуешься от RoomDatabase — и погнали.

Вот, смотри, как это выглядит на практике, простейший пример:

@Entity
data class User(
    @PrimaryKey val id: Int,
    val name: String
)

@Dao
interface UserDao {
    @Query("SELECT * FROM user")
    fun getAll(): List<User>

    @Insert
    fun insert(user: User)
}

@Database(entities = [User::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
    abstract fun userDao(): UserDao
}

Видишь? Никакого шаманства. Объявил сущность User, объявил DAO с методами, объявил базу — и у тебя уже рабочая система. Красота, ёпта!

Но есть, конечно, и нюансы, куда ж без них:

  • Миграции. Это отдельная песня. Когда схему базы меняешь (добавил колонку, например), версию повышаешь и пишешь объект Migration. Если не напишешь — приложение крашнется с ошибкой, что схема не совпадает. Доверия к этой системе, блядь, ноль, пока сам не наступишь на эти грабли.
  • Асинхронность. Запросы в главном потоке делать — смерти подобно. Поэтому все запросы, которые могут долго тянуться, нужно оборачивать в LiveData, Flow или делать в корутинах. Room с этим дружит.
  • Тестирование. Чтобы не засирать реальную базу при тестах, можно использовать inMemoryDatabaseBuilder. Создаёт базу в оперативке, которая после теста исчезает. Удобная штука, правда.

В общем, инструмент мощный. Сначала кажется, что overдохуища всего, но когда вникнешь — жить без него уже не можешь. Главное — миграции не просрать.