← Назад к вопросам

Что такое 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.

Что такое Room? Какие основные компоненты и как его использовать? | PrepBro