ฐานข้อมูล 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ViewModel และ LiveData
- ฐานข้อมูล Room
- โครูทีนและฟังก์ชัน Suspend
- รูปแบบ Repository
- คอมโพเนนต์ Navigation
- การฉีด Dependency ด้วย Hilt