Ответ
Да, есть. 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дохуища всего, но когда вникнешь — жить без него уже не можешь. Главное — миграции не просрать.