← Назад к вопросам
Что такое Room? Какие основные компоненты и как его использовать?
2.0 Middle🔥 121 комментариев
#Работа с данными
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Room — локальная база данных для Android
Room — это библиотека от Google, которая предоставляет абстракцию над SQLite и значительно упрощает работу с локальной базой данных на Android. Она входит в состав Android Architecture Components и рекомендуется официальной документацией Google.
Основные компоненты Room
1. Entity (Сущность) Entity — это класс, который представляет таблицу в базе данных. Каждое поле в классе соответствует колонке в таблице:
@Entity(tableName = "users")
data class User(
@PrimaryKey(autoGenerate = true)
val id: Int = 0,
@ColumnInfo(name = "user_name")
val name: String,
val email: String
)
2. DAO (Data Access Object) DAO содержит методы для выполнения операций с данными (CRUD операции):
@Dao
interface UserDao {
@Insert
suspend fun insert(user: User)
@Update
suspend fun update(user: User)
@Delete
suspend fun delete(user: User)
@Query("SELECT * FROM users WHERE id = :userId")
fun getUserById(userId: Int): Flow<User>
@Query("SELECT * FROM users")
fun getAllUsers(): Flow<List<User>>
}
3. Database (База данных) Абстрактный класс, который создаёт инстанс базы данных и предоставляет доступ к DAO:
@Database(entities = [User::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
abstract fun userDao(): UserDao
companion object {
@Volatile
private var INSTANCE: AppDatabase? = null
fun getDatabase(context: Context): AppDatabase {
return INSTANCE ?: synchronized(this) {
Room.databaseBuilder(
context,
AppDatabase::class.java,
"app_db"
).build().also { INSTANCE = it }
}
}
}
}
Использование Room
В Repository:
class UserRepository(private val userDao: UserDao) {
val allUsers: Flow<List<User>> = userDao.getAllUsers()
suspend fun addUser(user: User) {
userDao.insert(user)
}
}
В ViewModel:
class UserViewModel(private val repository: UserRepository) : ViewModel() {
val allUsers = repository.allUsers
.stateIn(viewModelScope, SharingStarted.Lazily, emptyList())
}
Ключевые преимущества
- Type-safe запросы — ошибки выявляются на этапе компиляции
- Интеграция с Coroutines — поддержка suspend функций и Flow
- Миграции — встроенная система версионирования схемы БД
- Reactive — автоматические обновления UI при изменении данных
- Удобство — меньше boilerplate кода, чем с чистым SQLite
Room — стандарт для работы с локальным хранилищем на современном Android.