รูปแบบ Repository
แยกการเข้าถึงข้อมูลออกจากส่วนติดต่อผู้ใช้ด้วยรูปแบบ Repository ประสานงานระหว่างฐานข้อมูล Room และ API เครือข่ายให้เป็นแหล่งข้อมูลจริงเพียงแห่งเดียว
รูปแบบ Repository เป็นบทเรียน Android Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 6 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Android Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Android Academy มีบทเรียนทั้งหมด 6 บทเรียน
ทำไมต้องใช้ Repository
เมื่อแอปของคุณมีขนาดใหญ่ขึ้น ViewModel อาจเต็มไปด้วยโค้ดเข้าถึงข้อมูล (คำสั่ง Room การเรียก Retrofit และการอ่าน SharedPreferences)
รูปแบบ Repository จะรวมการเข้าถึงข้อมูลทั้งหมดไว้เบื้องหลังคลาสเดียว ViewModel จะติดต่อกับ Repository เท่านั้น โดยไม่จำเป็นต้องรู้ว่าข้อมูลมาจากที่ใด
ชั้นต่าง ๆ ของสถาปัตยกรรม
สถาปัตยกรรม Android ที่แนะนำมีสามชั้น:
- ชั้น UI — Activity/Fragment แสดงข้อมูลและส่งเหตุการณ์จากผู้ใช้
- ViewModel — เก็บสถานะ ประมวลผลเหตุการณ์ และเรียกใช้ Repository
- Repository — ดึงข้อมูลจาก Room (ภายในเครื่อง) หรือ Retrofit (ระยะไกล) และตัดสินใจว่าจะใช้แหล่งใด
Repository แบบง่าย
สร้างคลาส Repository ที่ห่อหุ้ม DAO และ API ระยะไกลของคุณ:
class NoteRepository(private val dao: NoteDao) {
// Expose a Flow that emits whenever data changes
val allNotes = dao.getAllNotes()
suspend fun insert(note: Note) {
dao.insert(note)
}
suspend fun delete(note: Note) {
dao.delete(note)
}
suspend fun update(note: Note) {
dao.update(note)
}
}ViewModel ใช้ Repository
ViewModel รับข้อมูลจาก Repository ไม่ใช่จาก DAO โดยตรง:
class NoteViewModel(private val repo: NoteRepository) : ViewModel() {
val notes = repo.allNotes // Flow from Repository
fun addNote(title: String, body: String) {
viewModelScope.launch {
repo.insert(Note(title = title, body = body))
}
}
fun deleteNote(note: Note) {
viewModelScope.launch {
repo.delete(note)
}
}
}กลยุทธ์แคชก่อน
รูปแบบ Repository ที่ใช้กันทั่วไปคือ แคชก่อน โดยแสดงข้อมูลที่แคชไว้ในเครื่องทันที จากนั้นจึงรีเฟรชจากเครือข่ายในเบื้องหลัง:
- 1. ส่งข้อมูลที่แคชไว้จาก Room ออกมาทันที
- 2. ดึงข้อมูลล่าสุดจาก API
- 3. บันทึกลง Room — Flow จะอัปเดตโดยอัตโนมัติ
วิธีนี้ทำให้โหลดได้รวดเร็วและได้ข้อมูลที่เป็นปัจจุบันในท้ายที่สุด
การใช้งานแคชก่อน
รีเฟรชฐานข้อมูลภายในเครื่องจากเครือข่าย:
class ProductRepository(
private val dao: ProductDao,
private val api: ProductApiService
) {
// Room Flow emits local data immediately
val products = dao.getAllProducts()
// Call this to sync with the server
suspend fun refresh() {
try {
val remoteProducts = api.getProducts()
dao.insertAll(remoteProducts) // overwrites local cache
} catch (e: Exception) {
// Network failed — cached data is still shown
}
}
}ViewModelFactory
เมื่อ ViewModel มีพารามิเตอร์ในตัวสร้าง คุณต้องใช้ ViewModelFactory เพื่อสร้างอินสแตนซ์:
class NoteViewModelFactory(
private val repo: NoteRepository
) : ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
@Suppress("UNCHECKED_CAST")
return NoteViewModel(repo) as T
}
}
// In Activity:
val db = NoteDatabase.getInstance(this)
val repo = NoteRepository(db.noteDao())
val factory = NoteViewModelFactory(repo)
val viewModel = ViewModelProvider(this, factory)[NoteViewModel::class.java]ฮิลต์สำหรับการฉีดการพึ่งพา
การสร้างอินสแตนซ์ของ Repository และ ViewModel ด้วยตนเองอาจยุ่งยากในแอปขนาดใหญ่ ฮิลต์ (การฉีดการพึ่งพา) จะทำให้กระบวนการนี้เป็นอัตโนมัติ:
- ใส่คำอธิบายประกอบให้คลาสด้วย
@HiltViewModelและ@Inject - ฮิลต์จะสร้างและจัดเตรียมการพึ่งพาให้โดยอัตโนมัติ
- ไม่ต้องเขียนโค้ดประกอบของ factory ทั้งหมดเอง
สรุปประโยชน์
รูปแบบ Repository มอบประโยชน์ดังนี้:
- ทดสอบได้ — แทนที่ API จริงด้วยตัวจำลองสำหรับการทดสอบหน่วย
- แยกหน้าที่รับผิดชอบ — ViewModel ไม่จำเป็นต้องรู้ว่าข้อมูลอยู่ภายในเครื่องหรืออยู่ระยะไกล
- แหล่งข้อมูลจริงเพียงแหล่งเดียว — Room เป็นแหล่งข้อมูลหลักเสมอ ส่วน API มีหน้าที่รีเฟรชข้อมูล
- ยืดหยุ่น — เพิ่มการแคช การแบ่งหน้า หรือแหล่งข้อมูลใหม่ได้โดยไม่ต้องแก้ไข ViewModel
ตรวจสอบอย่างรวดเร็ว
หน้าที่หลักของ Repository ในสถาปัตยกรรม Android คืออะไร
ทบทวน: รูปแบบ Repository
ตอนนี้คุณเข้าใจสถาปัตยกรรม Android ที่แนะนำแล้ว:
- UI → ViewModel → Repository → (Room / Retrofit)
- Repository เป็นแหล่งข้อมูลจริงเพียงแหล่งเดียว
- แคชก่อน: แสดงข้อมูลภายในเครื่องทันที แล้วรีเฟรชในเบื้องหลัง
- ใช้ ViewModelFactory เมื่อ ViewModel มีพารามิเตอร์ของตัวสร้าง
- ฮิลต์ทำให้การฉีดการพึ่งพาในแอปขนาดใหญ่เป็นอัตโนมัติ
คอร์สสุดท้าย: เครือข่ายและการขัดเกลา — Retrofit รูปภาพ และการเผยแพร่แอป
คำถามที่พบบ่อย
บทเรียน “รูปแบบ Repository” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “รูปแบบ Repository” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Android Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Android Academy มีบทเรียนทั้งหมด 6 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “รูปแบบ Repository”
แยกการเข้าถึงข้อมูลออกจากส่วนติดต่อผู้ใช้ด้วยรูปแบบ Repository ประสานงานระหว่างฐานข้อมูล Room และ API เครือข่ายให้เป็นแหล่งข้อมูลจริงเพียงแห่งเดียว คุณปฏิบัติ Android Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Android Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Android Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 6 บทเรียน
บทเรียน “รูปแบบ Repository” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Android Academy นี้ได้ไหม
ได้ บทเรียน Android Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ViewModel และ LiveData
- ฐานข้อมูล Room
- โครูทีนและฟังก์ชัน Suspend
- รูปแบบ Repository
- คอมโพเนนต์ Navigation
- การฉีด Dependency ด้วย Hilt