1. 기본 설정
build.gradle(Module) 추가
plugins {
...
id 'kotlin-kapt' // 추가
}
dependencies {
... //2022-04-25 기준
implementation "androidx.room:room-runtime:2.4.2"
kapt "androidx.room:room-compiler:2.4.2"
}
2. Room의 기본 구성요소
데이터 항목, 데이터 액세스 객체(DAO), 데이터베이스 클래스
2-1 데이터 항목
저장하려는 객체를 나타내는 항목으로 데이터베이스의 한 행에 저장하려는 값을 말한다.
1개 이상의 PrimaryKey가 필요하다
@Entity
data class User(
@PrimaryKey val id: Int,
val firstName: String?,
val lastName: String?
)
기본적으로 클래스 이름을 데이터베이스 테이블 이름으로, 필드 이름을 데이터베이스 열 이름으로 사용하기 때문에 테이블 이름을 다르게 하고 싶다면 @Entitiy의 주석 tableName, @ColumnInfo를 사용해야한다.
@Entity(tableName = "users")
data class User (
@PrimaryKey val id: Int,
@ColumnInfo(name = "first_name") val firstName: String?,
@ColumnInfo(name = "last_name") val lastName: String?
)
2-2 데이터 액세스 객체(DAO)
데이터베이스의 데이터를 쿼리 , 업데이트, 삽입, 삭제하는 데 사용할 수 있는 메서드 제공
쿼리를 동작시키는 부분
@Dao
interface UserDao {
@Insert
fun insertUser(user: User)
@Insert
fun insertAll(vararg users: User)
@Delete
fun delete(user: User)
@Query("DELETE FROM user")
fun deleteAll()
@Query("SELECT * FROM user")
fun getAll(): List<User>
}
* varargs[가변인자] - 인수를 원하는 수만큼 받는 매서드를 만듦
https://developer88.tistory.com/322
2-3 데이터베이스 클래스
데이터베이스를 보유하고 앱의 영구 데이터와 기본 연결을 위한 액세스 포인트 역할
RoomDataBase를 상속 받아 databaseBuilder를 통해 Dao에 접근하고 그를 통해 데이터에 접근할 수 있도록 함
@Database(entities = [User::class], version = 1)
abstract class AppDatabase : RoomDatabase(){
abstract fun userDao():UserDao
}
데이터베이스 객체는 싱글톤으로 선언하는 것이 바람직하다.
(접근할 때마다 객체 생성하면 많은 비용이 들 뿐만아니라 단일 프로세스 내에서 여러 인스턴스에 액세스할 필요가 없음.)
companion object {
@Volatile // Multi-Thread safe 하도록 Volatile 선언
private var instance: AppDatabase? = null
fun getInstance(context: Context): AppDatabase {
synchronized(this) {
var instance = instance
if (instance == null) {
instance = Room.databaseBuilder(
context.applicationContext,
AppDatabase::class.java,
"user.db" // DB 파일 이름
)
.fallbackToDestructiveMigration()
.build()
this.instance = instance
}
return instance
}
}
}
https://cocoslime.github.io/blog/Room/
[전체 참고]
https://developer.android.com/training/data-storage/room?hl=ko
'개발 공부 > 안드로이드' 카테고리의 다른 글
android contextMenu - 선택지 띄우기, recyclerview (0) | 2022.07.03 |
---|---|
Android Room 2 - 적용하기 (0) | 2022.07.03 |
안드로이드 onNewIntent 관련 알아보기, lauchMode (0) | 2022.07.03 |
android, kotlin 시간차이 구하기 (0) | 2022.07.03 |
andrid SoundPool 음성파일/효과음 재생 (0) | 2022.07.03 |