0Pricing
Android Academy · Урок

База данных 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 — локальная установка не требуется.

Все уроки этого курса

  1. ViewModel и LiveData
  2. База данных Room
  3. Корутины и приостанавливаемые функции
  4. Шаблон репозитория
  5. Компонент навигации
  6. Внедрение зависимостей с Hilt
← Назад к Android Academy