-
[Android/Kotlin] RoomAndroid/Kotlin 2022. 8. 18. 19:58반응형
[모든 포스팅은 개인적 공부를 위해 작성된 글입니다]
<Room이란?>
- 로컬 데이터베이스 사용을 위한 라이브러리
- 안드로이드 아키텍처 컴포넌트(AAC/Android Architecture Componet)의 구성 요소 중 하나
<장점>
- SQLite보다 간단하게 로컬 데이터베이스 사용 가능
- 디바이스가 오프라인 상태인 동안에 사용자가 데이터 사용할 수 있으며 온라인 상태가 되면 콘텐츠 변경 사항이 서버에 동기화됨(이로 인해 안드로이드 개발자 사이트에서는 SQLite 대신 Room 사용을 적극 권장하고 있다고 함)
- 내부적으로 SQLite를 사용하지만, 이를 자바나 코틀린으로 매핑해 접근성과 편의성 높여줌
- 어노테이션 사용하므로 직관성 높음
- Observation 형태 지원 -> 아키텍처 패턴에 적용이 쉬움
- SQL 쿼리의 컴파일 시간 확인 가능(쿼리가 올바르게 작성 되었는지 컴파일 시간에 확인할 수 있음)
- 반복적으로 오류 발생이 쉬운 상용구 코드 최소화는 편의 주석
- 간소화된 데이터베이스 이전 경로
<구성 요소>
1. Entitiy
- DB 테이블을 Java/Kotlin 클래스로 나타낸 것
- 데이터 모델 클래스
2. Dao(Database Access Object)
- DB에 접근해 select, insert, update, delete 등을 수행하는 메소드와 쿼리 포함
3. Database
- 데이터베이스를 보유하고 앱의 영구 데이터와의 기본 연결을 위한 기본 액세스 포인트 역할
- RoomDatabase()를 상속해야 하며 매개변수가 없는 추상 메서드 포함해야 함
- 테이블과 버전 정의
<사용 방법>
- gradle 앱 수준
apply plugin: 'kotlin-kapt'//
- plugins 아래에 위 코드 추가
//Room implementation("androidx.room:room-runtime:2.2.6") annotationProcessor("androidx.room:room-compiler:2.2.6") kapt 'androidx.room:room-compiler:2.2.6'
-
처음에는 안드로이드 개발자 사이트에 나와 있는 Room 설명에 따라 다른 것들도 많이 implement 되어 있었는데 막상 실행해보니 오류가 발생했었다.. StackOverflow에 검색해보니 이정도만 implement 해도 충분히 사용 가능하다고 함(+안드로이그 개발자 사이트 설명에 가끔 오류가 있다고 한다..)*아래의 예제는 실제 ToDo 관리 앱을 개발하면서 직접 작성한 코드입니다*
- Entitiy 클래스 정의
@Entity data class ToDo( @PrimaryKey(autoGenerate = true) var uid: Int?, @ColumnInfo(name = "title") val title: String, //제목 @ColumnInfo(name = "date") val date: String, //날짜 @ColumnInfo(name = "time") val time: String, //시간 @ColumnInfo(name = "info") val info: String?, //ToDo 내용 @ColumnInfo(name = "alarm") val alarm: Boolean?, //알람 설정 여부 @ColumnInfo(name = "alarm_time") val alarm_time: String?, //알람 시간 @ColumnInfo(name = "check_finish") val check_finish: Boolean, //완료 여부 @ColumnInfo(name = "toDo_year") val toDo_year: Int, @ColumnInfo(name = "toDo_month") val toDo_month: Int, @ColumnInfo(name = "toDo_day") val toDo_day: Int ): Serializable
- 각각의 Entity는 PrimaryKey가 반드시 필요
- autoGenerate를 통해 자동으로 id 생성 가능
https://jeong-yeon.tistory.com/80
[Android/Kotlin] Room AutoIncrement 사용하기
[모든 포스팅은 개인적 공부를 위해 작성된 글입니다] @Entity data class ToDo ( @PrimaryKey(autoGenerate = true) var uid: Int?, @ColumnInfo(name = "group") val group: String, //그룹 @ColumnInfo(name =..
jeong-yeon.tistory.com
- Dao(Database Access Object) 정의
@Dao interface ToDo_Dao { @Query("SELECT * FROM ToDo WHERE date = :date") fun getAllTodo(date: String): List<ToDo> //모든 ToDo 가져옴 @Insert(onConflict = OnConflictStrategy.REPLACE) fun insertToDo(toDo: ToDo) @Query("UPDATE ToDo SET title=:title, date=:date, time=:time, info=:info, alarm=:alarm, alarm_time=:alarm_time, check_finish=:check_finish, toDo_year=:toDo_year, toDo_month=:toDo_month, toDo_day=:toDo_day WHERE uid=:uid") fun updateToDo( uid: Int?, title: String, date: String, time: String, info: String?, alarm: Boolean?, alarm_time: String?, check_finish: Boolean, toDo_year: Int, toDo_month: Int, toDo_day: Int ) @Query("DELETE FROM ToDo WHERE uid=:uid") fun deleteToDo(uid: Int?) @Query("DELETE FROM ToDo") fun deleteAll() @Query("SELECT * FROM ToDo") fun get_moveData(): List<ToDo> @Query("SELECT * FROM ToDo WHERE toDo_year=:toDo_year AND toDo_month=:toDo_month") fun get_exist_day(toDo_year: Int, toDo_month: Int): List<ToDo> @Query("SELECT * FROM ToDo") fun getToDoAll(): List<ToDo> }
- ':' 을 사용해 매개변수를 쿼리에 사용할 수 있음
- Database 정의
@Database(entities = [ToDo::class], version = 1) abstract class ToDo_Database: RoomDatabase() { abstract fun get_toDo_dao(): ToDo_Dao }
- 위에서 설명했듯이 테이블과 버전 정의
- Repository에서 Room 사용하기
private val db = Room.databaseBuilder( context, ToDo_Database::class.java, "database" ).allowMainThreadQueries().build()
- allowMainThreadQueries() : Room은 기본적으로 Main Thread에 접근할 수 없지만 allowMainThreadQueries()를 사용하여 만든 인스턴스에서는 Main Thread에 접근 가능(데이터베이스 작업은 무거운 작업이고 UI를 오랫동안 잠글 수 있기 때문에 MainThread에서 접근하는 것은 좋지 않음)
- AsyncTask나 Coroutine 사용하고 allowMainThreadQueries() 사용하지 않는 방법 권장
- Database 내부에 db 생성하는 함수 생성한 후 ToDo_Database.함수명()으로 바로 접근해도 됨(아래 블로그 참조)
https://blog.yena.io/studynote/2018/09/08/Android-Kotlin-Room.html[Android][Kotlin] Room 으로 DB 저장하기
로컬 DB를 저장할 일이 있어서 SQLite를 살펴보다가, 작년에 발표된 Room이라는 존재를 알게 되었다. 과연 정말 SQLite보다 간단하고 좋을까? 라는 의문으로 시작해서 이번 포스트를 작성하게 되었다.
blog.yena.io
override fun getToDo(date: String): List<ToDo> { return db.get_toDo_dao().getAllTodo(date) } override fun addToDo(item: ToDo) { db.get_toDo_dao().insertToDo(item) }
*참고하면 좋은 내용(Room을 위한 7가지 전문가 팁)*
https://medium.com/androiddevelopers/7-pro-tips-for-room-fbadea4bfbd1#829a
7 Pro-tips for Room
Learn how you can get the most out of Room
medium.com
반응형'Android > Kotlin' 카테고리의 다른 글
[Android/Kotlin] LayoutInflater (0) 2022.08.24 [Android/Kotlin] Coroutine(코루틴) (0) 2022.08.18 [Android/Kotlin] numberPicker.value (setValue) 안 될 때 (0) 2022.08.16 [Android/Kotlin] 리사이클러뷰(RecyclerView) 구분선 넣기 (0) 2022.08.12 [Android/Kotlin] Any 형 변환(타입 변환) (0) 2022.08.12