안드로이드에서 로컬에 데이터를 저장하는 방식은 여러가지가 있다. 데이터의 크기, 용도 등을 따져 알맞게 골라서 사용하면 될 것 같다.
1. SharedPreferences
2. Room
3. Realm
👉 Query문을 작성하는게 익숙한 나.. App의 용량이 너무 커지고 싶지 않은 나.. Room과 잘 맞을지도.. 그럼 Room의 사용방법을 알아보자
def room_version = "2.5.0"
implementation("androidx.room:room-runtime:$room_version")
kapt("androidx.room:room-compiler:$room_version")
앱 수준의 build.gradle의 dependency안에 위와 같이 추가하였다.
또한 kapt를 사용하기 위해 plugin에 id 'kotlin-kapt' 추가하였다.
Room에는 3가지 주요 구성요소가 존재한다. ORM 방식이라 그런지 JPA를 썼을 때와 유사한 느낌이다.
1. Database
2. Entity
3. DAO (Data Access Object)
아래는 Room 구성요소 간 관계를 나타낸다.
Database 클래스는 DB와 연결된 DAO 인스턴스를 앱에 제공한다. 그러면 앱은 DAO를 사용하여 DB의 데이터를 연결된 데이터 항목 객체의 인스턴스로 검색할 수 있게 된다. 이를 코드로 구현해보자
@Entity(tableName = "word")
data class Word(
val text: String,
val mean: String,
val type: String,
@PrimaryKey(autoGenerate = true) val id: Int = 0,
👉 더 상세한 데이터 정의는 레퍼런스를 참고하자
@Dao
interface WordDao {
@Query("SELECT * from word ORDER BY id DESC")
fun getAll(): List<Word>
@Query("SELECT * from word ORDER BY id DESC LIMIT 1")
fun getLatestWord(): Word
@Insert
fun insert(word: Word)
@Delete
fun delete(word: Word)
@Update
fun update(word: Word)
}
👉 더 상세한 데이터 액세스 정의는 레퍼런스를 참고하자
@Database(entities = [Word::class], version = 1)
abstract class AppDatabase: RoomDatabase() {
abstract fun wordDao(): WordDao
}
// Database Instance 생성
val db = Room.databaseBuilder(
applicationContext,
AppDatabase::class.java,
"db-name.db"
).build()
/* ... */
val wordDao = db.wordDao()
val words: List<Word> = wordDao.getAll()
@Database(entities = [Word::class], version = 1)
abstract class AppDatabase: RoomDatabase() {
abstract fun wordDao(): WordDao
companion object {
private var INSTANCE: AppDatabase? = null
fun getInstance(context: Context): AppDatabase? {
if(INSTANCE == null) {
synchronized(AppDatabase::class.java) {
INSTANCE = Room.databaseBuilder(
context.applicationContext,
AppDatabase::class.java,
"app-database.db"
).build()
}
}
return INSTANCE
}
}
}
/* 사용 */
val words: List<Word> = AppDatabase.getInstance(this)?.wordDao()?.getAll()
생으로 SQLite에 접근해서 해봤던 경험이 전부였었는데, 이렇게 만들어주니까 너무 편하다.
하다가 모르는건 Android Developers에서 먼저 찾아보는 습관을 들이자