0Pricing
Android Academy · Lekcja

Baza danych Room

Trwale przechowuj uporządkowane dane lokalnie za pomocą Room. Zdefiniuj Entities, DAOs i klasę Database. Wykonuj zapytania SQL i obserwuj wyniki za pomocą LiveData lub Flow.

Baza danych Room to bezpłatna lekcja Android Academy na CoddyKit. To lekcja 2 z 6. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Android Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Android Academy zawiera 6 lekcji w sumie.

Czym jest Room?

Room to zalecana przez Google biblioteka utrwalania danych dla Androida. Jest nakładką na SQLite, która zapewnia:

  • zapytania SQL z bezpieczeństwem typów, weryfikowane podczas kompilacji
  • obsługę korutyn Kotlin
  • integrację z LiveData / Flow
  • obsługę migracji przy zmianach schematu

Trzy komponenty Room

Room składa się z trzech adnotacji:

  • @Entity — klasa danych mapowana na tabelę bazy danych
  • @Dao (Data Access Object) — interfejs zawierający zapytania SQL
  • @Database — główna klasa bazy danych, która łączy wszystkie elementy

Dodawanie zależności Room

Proszę dodać Room do pliku 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
}

Definiowanie encji

Proszę oznaczyć klasę danych adnotacją @Entity, aby utworzyć tabelę bazy danych:

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

Tworzenie DAO

Proszę zdefiniować zapytania w interfejsie DAO. Room wygeneruje implementację automatycznie:

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)
}

Tworzenie bazy danych

Klasa @Database jest punktem wejścia do Room. Należy utworzyć ją jednokrotnie i przechowywać jako 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 }
            }
        }
    }
}

Używanie Room w ViewModel

Proszę podłączyć DAO w ViewModel, używając korutyn:

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)
        }
    }
}

Obserwowanie danych Room w interfejsie użytkownika

Proszę zbierać Flow z Room w Activity lub 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
            }
        }
    }
}

Migracje bazy danych

Po zmianie encji (dodaniu kolumny lub zmianie nazwy tabeli) należy zapewnić migrację, aby istniejące dane użytkowników nie zostały utracone.

Proszę zwiększyć numer wersji w @Database(version = 2) i zdefiniować obiekt Migration zawierający kod SQL przekształcający stary schemat w nowy.

Szybkie sprawdzenie

Jaka adnotacja Room oznacza metodę interfejsu jako zapytanie SQL SELECT?

Podsumowanie: baza Room

Potrafią już Państwo tworzyć aplikacje z lokalnym przechowywaniem danych:

  • @Entity — klasa danych → tabela bazy danych
  • @Dao — interfejs z adnotacjami @Query, @Insert, @Delete
  • @Database — singleton będący punktem wejścia
  • Zwracanie Flow<List> z DAO w celu zapewnienia aktualizacji na żywo
  • Wywoływanie DAO z ViewModel za pomocą viewModelScope.launch

Następnie: pisanie kodu asynchronicznego bez callbacków za pomocą korutyn.

Często zadawane pytania

Czy lekcja „Baza danych Room” jest bezpłatna?

Tak — pełny tekst „Baza danych Room” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Android Academy, przejdź na CoddyKit PRO. Kurs Android Academy zawiera 6 lekcji w sumie.

Co nauczysz się w „Baza danych Room”?

Trwale przechowuj uporządkowane dane lokalnie za pomocą Room. Zdefiniuj Entities, DAOs i klasę Database. Wykonuj zapytania SQL i obserwuj wyniki za pomocą LiveData lub Flow. Ćwiczysz Android Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Android Academy?

Nie wymagamy żadnego doświadczenia. Android Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 6.

Ile czasu zajmuje lekcja „Baza danych Room”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Android Academy?

Tak. Każda lekcja Android Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. ViewModel i LiveData
  2. Baza danych Room
  3. Korutyny i funkcje suspend
  4. Wzorzec Repository
  5. Navigation Component
  6. Wstrzykiwanie zależności z Hilt
← Powrót do Android Academy