Obserwowanie danych za pomocą Flow
Reaguj reaktywnie na zmiany w bazie danych
Obserwowanie danych za pomocą Flow to bezpłatna lekcja Android Academy na CoddyKit. To lekcja 4 z 4. 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 4 lekcji w sumie.
Reaktywne odczyty z bazy danych
Zamiast wykonywać zapytanie tylko raz, Room może zwrócić obiekt Flow, który emituje nową wartość za każdym razem, gdy zmienią się dane źródłowe. Interfejs użytkownika aktualizuje się automatycznie.
Zwracanie Flow z DAO
Należy zadeklarować typ zwracany jako Flow<...>. Proszę zauważyć, że nie jest to funkcja suspend.
@Query("SELECT * FROM users ORDER BY name")
fun observeUsers(): Flow<List<User>>Dlaczego tutaj nie używać suspend
Funkcja suspend zwraca pojedynczy wynik i kończy działanie. Flow jest ciągłym strumieniem, dlatego jest zwykłą funkcją zwracającą obiekt strumienia; wartości zbiera się w czasie.
Jak Room wie, kiedy emitować ponownie
Room śledzi tabele, których dotyczy zapytanie. Gdy dowolny zapis zmieni dane w tych tabelach, Room ponownie wykonuje zapytanie i emituje aktualny wynik w strumieniu Flow. Dzieje się to automatycznie.
Zbieranie wartości w korutynie
Wartości ze strumienia zbiera się wewnątrz korutyny, zazwyczaj w ViewModelu.
viewModelScope.launch {
dao.observeUsers().collect { users ->
_uiState.value = UiState(users)
}
}Mapowanie Flow
Przed udostępnieniem strumienia można go przekształcić za pomocą operatorów, takich jak map.
val names: Flow<List<String>> =
dao.observeUsers().map { list ->
list.map { it.name }
}Konwertowanie na StateFlow
Zimny przepływ DAO można przekonwertować na gorący StateFlow dla interfejsu użytkownika za pomocą stateIn.
val uiState = dao.observeUsers()
.map { UiState(it) }
.stateIn(
viewModelScope,
SharingStarted.WhileSubscribed(5000),
UiState()
)Zbieranie wartości w Compose
Ekran zbiera ten stan z uwzględnieniem cyklu życia, dokładnie tak, jak nauczono wcześniej.
@Composable
fun UsersScreen(vm: UserViewModel) {
val state by vm.uiState
.collectAsStateWithLifecycle()
UserList(state.users)
}Pełny łańcuch reaktywny
Podsumowując:
- Room emituje wartości po zmianie danych.
- ViewModel mapuje je na stan interfejsu użytkownika za pomocą
stateIn. - Compose zbiera je za pomocą
collectAsStateWithLifecycle.
Zapisz dane w bazie w dowolnym miejscu, a ekran odświeży się sam.
Jedno źródło prawdy
Ten wzorzec sprawia, że baza danych jest jedynym źródłem prawdy. Interfejs użytkownika nigdy nie przechowuje nieaktualnych kopii — zawsze odzwierciedla dane faktycznie zapisane.
Zapisy wywołują aktualizacje
Każda operacja wstawiania, aktualizowania lub usuwania w obserwowanej tabeli powoduje ponowną emisję wartości w strumieniu, więc po zmianie nie trzeba ręcznie odświeżać listy.
suspend fun addUser(u: User) = dao.insert(u)
// observeUsers() flow re-emits automaticallySzybkie sprawdzenie
Sprawdź swoją wiedzę na temat obserwowania danych za pomocą Flow.
Powtórzenie
Uczestnik nauczył się:
- Metody DAO zwracające
Flowemitują wartości ponownie po zmianie danych. - Są zwykłymi funkcjami, które nie są funkcjami suspend i zwracają strumień.
- Używać
stateIn+collectAsStateWithLifecycledo reaktywnego sterowania interfejsem użytkownika. - Baza danych staje się jedynym źródłem prawdy.
Często zadawane pytania
Czy lekcja „Obserwowanie danych za pomocą Flow” jest bezpłatna?
Tak — pełny tekst „Obserwowanie danych za pomocą Flow” 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 4 lekcji w sumie.
Co nauczysz się w „Obserwowanie danych za pomocą Flow”?
Reaguj reaktywnie na zmiany w bazie danych Ć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 4 z 4.
Ile czasu zajmuje lekcja „Obserwowanie danych za pomocą Flow”?
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
- Encje i DAO
- Klasa bazy danych Room
- Zapytania i relacje
- Obserwowanie danych za pomocą Flow