0Pricing
Android Academy · บทเรียน

รูปแบบ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ViewModel และ LiveData
  2. ฐานข้อมูล Room
  3. โครูทีนและฟังก์ชัน Suspend
  4. รูปแบบ Repository
  5. คอมโพเนนต์ Navigation
  6. การฉีด Dependency ด้วย Hilt
← กลับไปที่ Android Academy