Room ๋ง๊ณ SQL ์ข
๋ฅ ์ค ํ๋์ธ SQLite๊ฐ ์์
PC์ฉ ํ๋ก๊ทธ๋จ์ด ์๋๋ผ ์ข ๊ฐ๋ณ์ง๋ง SQLite๋ฅผ ์ฐ๋ ค๋ฉด ๋ณต์กํ๋ค.
๊ทธ๋์ ๋์จ ๊ฒ Room์ด๋ผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
SQLite๋ฅผ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๋ DB ๊ฐ์ฒด ๋งคํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
Query๋ฅผ ์ง์ ์์ฑํ์ง ์์๋ ๋จ
Query ๊ฒฐ๊ณผ๋ฅผ LiveData๋ก ํ์ฌ DB๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์ฝ๊ฒ UI๋ฅผ ๋ณ๊ฒฝํ ์ ์์
์๋๋ก์ด๋์์ SQLite๋ณด๋ค Room์ ์ฌ์ฉํ ๊ฒ์ ๊ถ์ฅ
RoomDatabase๋ฅผ ์์๋ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํด๋์ค์ ์ถ๊ฐํด์ผ ํ๋ ์ด๋ ธํ ์ด์
Database ์ ํ ์ด๋ธ์ ๋ง๋ค๊ธฐ ์ํด ์คํค๋ง๋ก ์ง์ ํ๋ ์ด๋ ธํ ์ด์
ํด๋์ค๋ฅผ DAO๋ก ์ง์ ํ๋ ์ด๋
ธํ
์ด์
๊ธฐ๋ณธ์ ์ธ insert, delete, update SQL์ ์๋์ผ๋ก ๋ง๋ค์ด์ฃผ๋ฉฐ ๋ณต์กํ SQL์ ์ง์ ๋ง๋ค ์ ์์
plugins {
...
id("kotlin-kapt")
}
dependencies{
....
implementation("androidx.room:room-runtime:2.6.1")
annotationProcessor("androidx.room:room-compiler:2.6.1")
kapt("androidx.room:room-compiler:2.6.1")
// optional - Kotlin Extensions and Coroutines support for Room
implementation("androidx.room:room-ktx:2.6.1")
// optional - Test helpers
testImplementation("androidx.room:room-testing:2.6.1")
Entity๋ค๊ณผ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฒ์ ์ @Database ์ด๋
ธํ
์ด์
์ ์ง์ ํจ
๊ธฐ์กด ๋ฒ์ ์ Database์์ ๋๊ธฐํ๋ฅผ ์ํด ๋ฒ์ ์ ๋ง์ถฐ์ฃผ๋ ๊ฒ ์ค์ํจ
๊ธฐ์กด์ ์ ์ฅ๋์ด ์๋ Database๋ณด๋ค ๋ฒ์ ์ด ๋์ผ๋ฉด Database๋ฅผ openํ ๋ migration์ ์ํํ๊ฒ ๋จ
Migration์ ํตํด ํ
์ด๋ธ์ ์ถ๊ฐํ๊ฑฐ๋ ๋ณ๊ฒฝํจ
Migration ์ํ ๋ฐฉ๋ฒ์ RoomDatabase ๊ฐ์ฒด์ addmigration() ๋ฉ์๋๋ฅผ ํตํด ์๋ ค์ค
๋ชจ๋ DB๋ ํ
์ด๋ธ์ ๊ฐ์ง๊ณ ์๊ณ ๊ทธ ํ
์ด๋ธ์ด ์ด๋ค ์ปฌ๋ผ์ ๊ฐ์ง๊ณ ์๋์ง ์ ์ํ ๊ฒ์ด ์คํค๋ง
Entity๋ ํ
์ด๋ธ ์คํค๋ง ์ ์
DAO๋ interface๋ abstract class๋ก ์ ์๋์ด์ผ ํจ
Annotation์ SQL ์ฟผ๋ฆฌ๋ฅผ ์ ์ํ๊ณ ๊ทธ ์ฟผ๋ฆฌ๋ฅผ ์ํ ๋ฉ์๋๋ฅผ ์ ์ธ
โกRoom์ ์ฐ๋ ์ด์ ์ค ํ๋
๋ง์ฝ @Insert, @Update ์ ๊ฐ์ด ์ค๋ณต๋์ ๋ ์ฒ๋ฆฌํ ์ต์ ์ ์๋์ ๊ฐ์
- OnConflictStrategy.ABORT: key ์ถฉ๋์ ์ข ๋ฃ
- OnConflictStrategy.IGNORE: key ์ถฉ๋ ๋ฌด์
- OnConflictStrategy.REPLACE: key ์ถฉ๋์ ์๋ก์ด ๋ฐ์ดํฐ๋ก ๋ณ๊ฒฝ
- @Update๋ @Delete๋ primary key์ ํด๋น๋๋ ํํ์ ์ฐพ์์ ๋ณ๊ฒฝ/์ญ์ ํจ
@Query๋ก ๋ฆฌํด๋๋ ๋ฐ์ดํฐ์ ํ์
์ LiveData<>๋ก ํ๋ฉด, ๋์ค์ ์ด ๋ฐ์ดํฐ๊ฐ ์
๋ฐ์ดํธ๋ ๋ Observer๋ฅผ ํตํด ํ ์ ์์
@Query์ SQL์ ์ ์ํ ๋ ๋ฉ์๋์ ์ธ์๋ฅผ ์ฌ์ฉํ ์ ์์
LiveData๋ ๋น๋๊ธฐ์ ์ผ๋ก ๋์ํ๊ธฐ ๋๋ฌธ์ coroutine์ผ๋ก ํ ํ์๊ฐ ์์
์ด๋ ๋ฒ์ ์์ ์ด๋ ๋ฒ์ ์ผ๋ก ๋ฐ๋ ๋ ์ด๋ค ๋์์ ํ ์ง ์ ํด์ค
RoomDatabase ๊ฐ์ฒด์์ DAO ๊ฐ์ฒด๋ฅผ ๋ฐ์์ค๊ณ ์ด DAO ๊ฐ์ฒด์ ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ ๊ทผํจ
UI ์ค๋ ๋์์ ๋คํธ์ํฌ๋ DB๋ฅผ ํธ์ถํ ์ ์๊ธฐ ๋๋ฌธ์ coroutine์ ์ฐ๊ณ runBlocking์ ๊ฑธ์ด๋์
LiveData<> ํ์
์ผ๋ก ๋ฆฌํด๋๋ DAO ๋ฉ์๋ ๊ฒฝ์ฐ
observe() ๋ฉ์๋๋ฅผ ์ด์ฉํด Observer๋ฅผ ์ง์ ํ๊ณ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์๋์ผ๋ก ํธ์ถ๋จ
RoomDatabase ์์๋ฐ์
์ฟผ๋ฆฌ ๋ ๋ฆด ๋ ์ฌ์ฉ
Student ํด๋์ค๊ฐ ๋ค์ด์์
student_id๋ ์ปฌ๋ผ๋ช
์ผ๋ก
binding.queryStudent.setOnClickListener {
val name = binding.editStudentName.text.toString()
CoroutineScope(Dispatchers.IO).launch {
val results = myDao.getStudentByName(name)
if (results.isNotEmpty()) {
val str = StringBuilder().apply {
results.forEach { student ->
append(student.id)
append("-")
append(student.name)
}
}
withContext(Dispatchers.Main) {
binding.textQueryStudent.text = str
}
} else {
withContext(Dispatchers.Main) {
binding.textQueryStudent.text = ""
}
}
}
}
withContext(Dispatchers.Main)์ผ๋ก ์์ฌ์๋ ์ด์
โกDB์ ๊ฒฐ๊ณผ์ ๋ฐ๋ผ์ ๋๋ ๋ฃจํด ์์ฒด๊ฐ Main UiThread๊ฐ ์๋ ๋ณ๋์ Thread์์ ๋์ํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ UI ์
๋ฐ์ดํธ๋ฅผ MainThread์์ ํ๊ธฐ ์ํด์ withContext ์ฌ์ฉ
RoomData๋ฅผ ์ฐ๋ ค๋ฉด
Database ํด๋์ค ๋ง๋ค๊ณ
์ฟผ๋ฆฌํ๋ Dao,
ํ
์ด๋ธ ๋ค์ด๊ฐ๋ Entity ๋ง๋ค์ด์
MainActivity์์ Database ์ธ์คํด์ค ์์ฑํ๊ณ
Dao ํตํด์ ์ฟผ๋ฆฌํ๊ณ
๊ฒฐ๊ณผ๋ฅผ ๋ฐ๋๋ค