Room là thư viện Jetpack bọc SQLite: bạn khai báo entity và câu query bằng annotation, Room sinh code lúc compile (qua KSP) và kiểm tra câu SQL ngay lúc build.
@Entity
data class Note(@PrimaryKey(autoGenerate = true) val id: Long = 0, val title: String)
@Dao
interface NoteDao {
@Query("SELECT * FROM Note WHERE title LIKE :q")
fun search(q: String): Flow<List<Note>>
@Insert
suspend fun insert(note: Note)
}
@Database(entities = [Note::class], version = 1)
abstract class AppDb : RoomDatabase() {
abstract fun noteDao(): NoteDao
}So với dùng SQLiteOpenHelper trực tiếp:
- Sai tên cột hay cú pháp SQL → lỗi compile, không phải crash lúc chạy.
- Không phải tự map Cursor sang object.
- Tham số :q được bind an toàn, tránh SQL injection do nối chuỗi.
- Trả về Flow → UI tự cập nhật khi bảng đổi; hàm suspend chạy ngoài main thread (Room mặc định chặn query trên main thread).
Lưu ý: đổi schema (thêm cột, thêm bảng) phải tăng version và viết Migration (hoặc dùng AutoMigration). Dùng fallbackToDestructiveMigration() cho nhanh sẽ xoá sạch dữ liệu người dùng khi cập nhật app.