База данных Room
Сохраняйте структурированные данные локально с помощью Room. Определяйте сущности, DAO и класс базы данных. Выполняйте запросы на SQL и наблюдайте за результатами через LiveData или Flow.
«База данных Room» — бесплатный урок Android Academy на CoddyKit. Это урок 2 из 6. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Android Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Android Academy содержит 6 уроков всего.
Что такое Room
Room — рекомендованная Google библиотека постоянного хранения данных для Android. Это оболочка над SQLite, которая предоставляет:
- Типобезопасные SQL-запросы, проверяемые во время компиляции
- Поддержку корутин Kotlin
- Интеграцию с LiveData и Flow
- Поддержку миграций при изменении схемы
Три компонента Room
Room состоит из трёх аннотаций:
@Entity— класс данных, соответствующий таблице базы данных@Dao(объект доступа к данным) — интерфейс с SQL-запросами@Database— основной класс базы данных, объединяющий все компоненты
Добавление зависимостей Room
Добавьте Room в app/build.gradle:
// app/build.gradle
plugins {
id 'kotlin-kapt' // needed for Room annotation processor
}
dependencies {
val roomVersion = "2.6.1"
implementation "androidx.room:room-runtime:$roomVersion"
kapt "androidx.room:room-compiler:$roomVersion"
implementation "androidx.room:room-ktx:$roomVersion" // coroutine support
}Определение Entity
Пометьте класс данных аннотацией @Entity, чтобы создать таблицу базы данных:
import androidx.room.Entity
import androidx.room.PrimaryKey
@Entity(tableName = "notes")
data class Note(
@PrimaryKey(autoGenerate = true)
val id: Int = 0,
val title: String,
val body: String,
val createdAt: Long = System.currentTimeMillis()
)
// Each field = one column in the database table
// @PrimaryKey autoGenerate = Room assigns the id automaticallyСоздание DAO
Определите запросы в интерфейсе DAO. Room сгенерирует реализацию автоматически:
import androidx.room.*
import kotlinx.coroutines.flow.Flow
@Dao
interface NoteDao {
@Query("SELECT * FROM notes ORDER BY createdAt DESC")
fun getAllNotes(): Flow<List<Note>> // emits new list whenever data changes
@Query("SELECT * FROM notes WHERE id = :noteId")
suspend fun getNoteById(noteId: Int): Note?
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insert(note: Note)
@Update
suspend fun update(note: Note)
@Delete
suspend fun delete(note: Note)
}Создание базы данных
Класс @Database — точка входа в Room. Создайте его один раз и храните как singleton:
import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase
import android.content.Context
@Database(entities = [Note::class], version = 1, exportSchema = false)
abstract class NoteDatabase : RoomDatabase() {
abstract fun noteDao(): NoteDao
companion object {
@Volatile private var INSTANCE: NoteDatabase? = null
fun getInstance(context: Context): NoteDatabase {
return INSTANCE ?: synchronized(this) {
Room.databaseBuilder(
context.applicationContext,
NoteDatabase::class.java,
"note_database"
).build().also { INSTANCE = it }
}
}
}
}Использование Room в ViewModel
Подключите DAO в ViewModel с помощью корутин:
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import kotlinx.coroutines.launch
class NoteViewModel(private val dao: NoteDao) : ViewModel() {
val notes = dao.getAllNotes() // Flow — auto-updates when DB changes
fun addNote(title: String, body: String) {
viewModelScope.launch {
dao.insert(Note(title = title, body = body))
}
}
fun deleteNote(note: Note) {
viewModelScope.launch {
dao.delete(note)
}
}
}Наблюдение за данными Room в интерфейсе
Собирайте Flow из Room в Activity или Fragment:
import androidx.lifecycle.lifecycleScope
import kotlinx.coroutines.launch
class NoteActivity : AppCompatActivity() {
private val viewModel: NoteViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// ...
lifecycleScope.launch {
viewModel.notes.collect { notes ->
adapter.submitList(notes) // update RecyclerView
}
}
}
}Миграции базы данных
При изменении Entity (добавлении столбца или переименовании таблицы) необходимо предоставить миграцию, чтобы существующие пользовательские данные не были потеряны.
Увеличьте номер версии в @Database(version = 2) и определите объект Migration с SQL-кодом для преобразования старой схемы в новую.
Быстрая проверка
Какая аннотация Room помечает метод интерфейса как SQL-запрос SELECT?
Итоги: база данных Room
Теперь вы умеете создавать приложения с постоянным хранением локальных данных:
@Entity— класс данных → таблица базы данных@Dao— интерфейс с@Query,@Insert,@Delete@Database— единая точка входа- Возвращайте
Flow<List>из DAO для обновлений в реальном времени - Вызывайте DAO из ViewModel с помощью
viewModelScope.launch
Далее: асинхронный код без callback-функций с помощью Coroutines.
Часто задаваемые вопросы
Урок «База данных Room» бесплатный?
Да — полный текст урока «База данных Room» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Android Academy, подпишись на CoddyKit PRO. Курс Android Academy содержит 6 уроков всего.
Чему я научусь в уроке «База данных Room»?
Сохраняйте структурированные данные локально с помощью Room. Определяйте сущности, DAO и класс базы данных. Выполняйте запросы на SQL и наблюдайте за результатами через LiveData или Flow. Ты практикуешь Android Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Android Academy?
Предыдущий опыт не требуется. Android Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 6.
Сколько времени занимает урок «База данных Room»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Android Academy?
Да. Каждый урок Android Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- ViewModel и LiveData
- База данных Room
- Корутины и приостанавливаемые функции
- Шаблон репозитория
- Компонент навигации
- Внедрение зависимостей с Hilt