การสังเกตข้อมูลด้วย Flow
ตอบสนองต่อการเปลี่ยนแปลงฐานข้อมูลแบบรีแอกทีฟ
การสังเกตข้อมูลด้วย Flow เป็นบทเรียน Android Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Android Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Android Academy มีบทเรียนทั้งหมด 4 บทเรียน
การอ่านฐานข้อมูลแบบตอบสนอง
แทนที่จะค้นหาเพียงครั้งเดียว Room สามารถส่งคืนโฟลว์ที่ปล่อยค่าใหม่ทุกครั้งที่ข้อมูลต้นทางเปลี่ยนแปลงได้ ส่วนติดต่อผู้ใช้ของคุณจะอัปเดตโดยอัตโนมัติ
การส่งคืนโฟลว์จาก DAO
ประกาศชนิดข้อมูลที่ส่งคืนเป็น Flow<...> โปรดสังเกตว่านี่ไม่ใช่ฟังก์ชันระงับการทำงาน
@Query("SELECT * FROM users ORDER BY name")
fun observeUsers(): Flow<List<User>>เหตุใดจึงไม่ใช้ suspend ที่นี่
ฟังก์ชัน suspend ส่งคืนผลลัพธ์เดียวแล้วจบการทำงาน ส่วน Flow เป็นกระแสข้อมูลที่ทำงานต่อเนื่อง จึงเป็นฟังก์ชันปกติที่ส่งคืนออบเจ็กต์กระแสข้อมูล แล้วคุณจึงเก็บค่าจากมันตามเวลา
Room รู้ได้อย่างไรว่าต้องปล่อยค่าใหม่
Room ติดตามว่าการค้นหาแตะต้องตารางใดบ้าง เมื่อมีการเขียนข้อมูลใด ๆ ส่งผลต่อตารางเหล่านั้น Room จะดำเนินการค้นหาอีกครั้งและปล่อยผลลัพธ์ล่าสุดลงในโฟลว์ การทำงานนี้เกิดขึ้นโดยอัตโนมัติ
การเก็บค่าในคอร์รูทีน
คุณเก็บค่าจากโฟลว์ภายในคอร์รูทีน โดยทั่วไปจะทำใน ViewModel
viewModelScope.launch {
dao.observeUsers().collect { users ->
_uiState.value = UiState(users)
}
}การแมปโฟลว์
คุณสามารถแปลงกระแสข้อมูลด้วยตัวดำเนินการอย่าง map ก่อนเปิดเผยให้ส่วนอื่นใช้งาน
val names: Flow<List<String>> =
dao.observeUsers().map { list ->
list.map { it.name }
}การเปลี่ยนเป็น StateFlow
แปลงโฟลว์ DAO แบบเย็นเป็น StateFlow แบบร้อนสำหรับส่วนติดต่อผู้ใช้ด้วย stateIn
val uiState = dao.observeUsers()
.map { UiState(it) }
.stateIn(
viewModelScope,
SharingStarted.WhileSubscribed(5000),
UiState()
)การเก็บค่าใน Compose
หน้าจอจะเก็บค่าสถานะดังกล่าวโดยคำนึงถึงวงจรชีวิต เช่นเดียวกับที่คุณได้เรียนรู้ก่อนหน้านี้
@Composable
fun UsersScreen(vm: UserViewModel) {
val state by vm.uiState
.collectAsStateWithLifecycle()
UserList(state.users)
}ห่วงโซ่แบบตอบสนองทั้งหมด
เมื่อนำทุกอย่างมาประกอบกัน:
- Room ปล่อยค่าเมื่อข้อมูลเปลี่ยนแปลง
- ViewModel แมปข้อมูลเป็นสถานะส่วนติดต่อผู้ใช้ผ่าน
stateIn - Compose เก็บค่าด้วย
collectAsStateWithLifecycle
ไม่ว่าคุณจะเขียนข้อมูลลงฐานข้อมูลที่ใด หน้าจอจะรีเฟรชตัวเอง
แหล่งข้อมูลจริงเพียงแหล่งเดียว
รูปแบบนี้ทำให้ฐานข้อมูลเป็นแหล่งข้อมูลจริงเพียงแหล่งเดียว ส่วนติดต่อผู้ใช้จะไม่เก็บสำเนาที่ล้าสมัย แต่จะแสดงสิ่งที่จัดเก็บอยู่จริงเสมอ
การเขียนข้อมูลทำให้เกิดการอัปเดต
การเพิ่ม การอัปเดต หรือการลบข้อมูลใด ๆ ในตารางที่กำลังเฝ้าดู จะทำให้โฟลว์ปล่อยค่าใหม่ ดังนั้นคุณจึงไม่ต้องรีเฟรชรายการด้วยตนเองหลังจากมีการเปลี่ยนแปลง
suspend fun addUser(u: User) = dao.insert(u)
// observeUsers() flow re-emits automaticallyตรวจสอบความเข้าใจอย่างรวดเร็ว
ทดสอบความเข้าใจเกี่ยวกับการสังเกตข้อมูลด้วยโฟลว์
ทบทวน
คุณได้เรียนรู้ว่า:
- เมธอดของ DAO ที่ส่งคืน
Flowจะปล่อยค่าใหม่เมื่อข้อมูลเปลี่ยนแปลง - เมธอดเหล่านี้เป็นฟังก์ชันปกติ (ไม่ใช่ฟังก์ชันระงับการทำงาน) ที่ส่งคืนกระแสข้อมูล
- ใช้
stateIn+collectAsStateWithLifecycleเพื่อขับเคลื่อนส่วนติดต่อผู้ใช้แบบตอบสนอง - ฐานข้อมูลกลายเป็นแหล่งข้อมูลจริงเพียงแหล่งเดียว
คำถามที่พบบ่อย
บทเรียน “การสังเกตข้อมูลด้วย Flow” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การสังเกตข้อมูลด้วย Flow” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Android Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Android Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การสังเกตข้อมูลด้วย Flow”
ตอบสนองต่อการเปลี่ยนแปลงฐานข้อมูลแบบรีแอกทีฟ คุณปฏิบัติ Android Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Android Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Android Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “การสังเกตข้อมูลด้วย Flow” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Android Academy นี้ได้ไหม
ได้ บทเรียน Android Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- เอนทิตีและ DAO
- คลาสฐานข้อมูล Room
- คำค้นและความสัมพันธ์
- การสังเกตข้อมูลด้วย Flow