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

ฐานข้อมูล Room

จัดเก็บข้อมูลแบบมีโครงสร้างไว้ในเครื่องด้วย Room กำหนด Entities, DAOs และคลาส Database สืบค้นด้วย SQL และเฝ้าสังเกตผลลัพธ์ด้วย LiveData หรือ Flow

ฐานข้อมูล Room เป็นบทเรียน Android Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 6 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Android Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Android Academy มีบทเรียนทั้งหมด 6 บทเรียน

Room คืออะไร

Room เป็นไลบรารีจัดเก็บข้อมูลถาวรที่ Google แนะนำสำหรับ Android โดยเป็นตัวห่อหุ้ม SQLite ซึ่งมอบความสามารถดังนี้:

  • คิวรี SQL ที่ปลอดภัยด้านประเภทข้อมูลและตรวจสอบตอนคอมไพล์
  • รองรับโครูทีนของ Kotlin
  • ผสานรวมกับ LiveData / Flow
  • รองรับการย้ายข้อมูลเมื่อสคีมาเปลี่ยนแปลง

ส่วนประกอบสามอย่างของ Room

Room สร้างขึ้นจากคำอธิบายประกอบสามรายการ:

  • @Entity — data class ที่แมปกับตารางฐานข้อมูล
  • @Dao (ออบเจ็กต์เข้าถึงข้อมูล) — interface ที่มีคิวรี SQL
  • @Database — class ฐานข้อมูลหลักที่เชื่อมโยงทุกอย่างเข้าด้วยกัน

การเพิ่ม Dependency ของ Room

เพิ่ม Room ลงใน 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
}

การกำหนด Entity

ใส่คำอธิบายประกอบ @Entity ให้กับ data class เพื่อสร้างตารางฐานข้อมูล:

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 automatically

การสร้าง DAO

กำหนดคิวรีใน interface ของ DAO โดย Room จะสร้างการนำไปใช้งานให้คุณ:

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)
}

การสร้างฐานข้อมูล

class @Database เป็นจุดเริ่มต้นเข้าสู่ Room ให้สร้างเพียงครั้งเดียวและเก็บไว้เป็นซิงเกิลตัน:

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 }
            }
        }
    }
}

การใช้ Room ใน ViewModel

เชื่อมต่อ DAO ใน ViewModel โดยใช้โครูทีน:

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)
        }
    }
}

การสังเกตข้อมูล Room ใน UI

รวบรวม Flow จาก Room ใน Activity หรือ 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
            }
        }
    }
}

การย้ายข้อมูลฐานข้อมูล

เมื่อคุณเปลี่ยน Entity เช่น เพิ่มคอลัมน์หรือเปลี่ยนชื่อตาราง คุณต้องจัดเตรียม การย้ายข้อมูล เพื่อไม่ให้ข้อมูลผู้ใช้ที่มีอยู่สูญหาย

เพิ่มหมายเลขเวอร์ชันใน @Database(version = 2) และกำหนดออบเจ็กต์ Migration พร้อม SQL สำหรับเปลี่ยนสคีมาเก่าเป็นสคีมาใหม่

ตรวจสอบความเข้าใจ

คำอธิบายประกอบของ Room รายการใดใช้ระบุว่าเมธอดของ interface เป็นคิวรี SQL SELECT

ทบทวน: ฐานข้อมูล Room

ตอนนี้คุณสามารถสร้างแอปที่จัดเก็บข้อมูลในเครื่องให้คงอยู่ได้แล้ว:

  • @Entity — data class → ตารางฐานข้อมูล
  • @Dao — interface ที่มี @Query, @Insert, @Delete
  • @Database — จุดเริ่มต้นแบบซิงเกิลตัน
  • ส่งคืน Flow<List> จาก DAO เพื่ออัปเดตข้อมูลแบบสด
  • เรียก DAO จาก ViewModel โดยใช้ viewModelScope.launch

ถัดไป: เขียนโค้ดแบบไม่พร้อมกันโดยไม่ใช้ Callback ด้วย Coroutines

คำถามที่พบบ่อย

บทเรียน “ฐานข้อมูล Room” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “ฐานข้อมูล Room” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Android Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Android Academy มีบทเรียนทั้งหมด 6 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “ฐานข้อมูล Room”

จัดเก็บข้อมูลแบบมีโครงสร้างไว้ในเครื่องด้วย Room กำหนด Entities, DAOs และคลาส Database สืบค้นด้วย SQL และเฝ้าสังเกตผลลัพธ์ด้วย LiveData หรือ Flow คุณปฏิบัติ Android Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Android Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Android Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 6 บทเรียน

บทเรียน “ฐานข้อมูล Room” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Android Academy นี้ได้ไหม

ได้ บทเรียน Android Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

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