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 automaticallyTworzenie 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
- ViewModel i LiveData
- Baza danych Room
- Korutyny i funkcje suspend
- Wzorzec Repository
- Navigation Component
- Wstrzykiwanie zależności z Hilt