Android 공부

안드로이드 Room 고군분투


-1. 읽었으면 하는 글


2018/12/19 - [rxJava 공부] - RxJava 공부 4 - fromCallable, fromFuture


0. Room?


0.1. gradle 추가


1
2
3
implementation "android.arch.persistence.room:runtime:1.1.1"
kapt 'android.arch.persistence.room:compiler:1.1.1'
annotationProcessor "android.arch.persistence.room:compiler:1.1.1" // use kapt for Kotlin
cs


0.2. 잡담


흡사 내가 레트로핏을 처음 사용했을 때의 느낌과 비슷했다.

레트로핏을 사용하기 위해서 인터페이스를 만들고, 서비스를 만든 후에, RxJava와 함께 사용했던 것처럼 Room또한 그렇기 때문이다.


그리고 또한 예전에는 RxJava와 '왜 같이 사용할까?'라는 의문을 가졌는데, 지금은 하나의 정확한 답을 해줄 수 있다.


레트로핏이 언제 데이터를 가져오지 못 하기 때문에 RxJava와 함께 사용한다.

Room 또한 크게 다를 것 없이, 데이터를 언제 가져올 지 모르는 비동기적 속성을 갖고 있다.


그럼에도 우리는 비동기적 속성을 통해 얻는 손해보다 간편함과 생선이라는 이득이 있기 때문에 레트로핏을 사용한다.

이와 같이 Room을 통해서 DB를 맵핑해서 사용하나 싶었다.


나는 최근 들어서, 이러한 라이브러리(Room, 레트로핏)가 유사한 패턴으로 귀결된다는 것을 알았다.


1. 인터페이스를 만든다.

2. 랩핑 클래스를 만든다.

3. 랩핑 클래스를 호출한다.

4. RxJava로 맵핑한다.

5. Data를 뿌려준다.


라는 패턴으로 귀결되고, 확실하지 않지만 선언적 프로그래밍에서 볼 수 있는 패턴이라고 생각한다.

여기까지는 최근 하게 된 생각들이고, 다시 코드를 통해서 Room을 보도록 하겠다.


1.  DAO를 만든다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Dao
interface DailyTimeDao{
 
    @Query("SELECT * FROM DailyTime")
    fun getAll():MutableList<DailyTime>
 
    @Query("SELECT * FROM DailyTime WHERE whenDay IN (:todayDate)")
    fun getTodayTime(todayDate:String):List<DailyTime>
 
    @Update
    fun updateItem(dailyTime: DailyTime)
 
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun upsertItem(dailyTime: DailyTime):Long
}
cs


편리하게 Query를 입력하거나, 혹은 아이템을 통해서 update하거나 insert등을 할 수 있습니다.


2. AppDataBase를 만든다.


1
2
3
4
@Database(entities = [DailyTime::class], version = 1)
abstract class AppDataBase : RoomDatabase(){
    abstract fun dailyTimeDao(): DailyTimeDao
}
cs


3. AppDataBase를 호출한다.


1
2
val checkTimeDB = Room.databaseBuilder(activity, AppDataBase::class.java, "CHECK_TIME.db").build()
val timeLiveData = checkTimeDB.dailyTimeDao().getTodayTime(yyyyMMdd)
cs

4. RxJava로 맵핑하고, Data를 뿌려준다.


1
2
3
4
5
6
7
8
9
10
11
Observable.fromCallable {
            val checkTimeDB = Room.databaseBuilder(activity, AppDataBase::class.java, "CHECK_TIME.db").build() //DBOpenHelper와 같이 db의 이름을 입력하고 만든다.
            val timeDatas = checkTimeDB.dailyTimeDao().getTodayTime(yyyyMMdd)//임의로 만든 매소드를 호출한다.
            var mTodayWorker = timeDatas[0].studyTime!!.toInt()//임의로 사용할 변수를 입력
            return@fromCallable mTodayWorker//리턴
        }//fromCallable은 람다식 표현 안에 있는 로직들이 실행될 때까지 기다리고 그 값을 변수로 받아서 return한다.
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe({ mTodayWorker ->
                    updateTimerUI(mTodayWorker) //ui를 업데이트
                }, {}, {})
cs



이처럼 Room은 RxJava를 통해서 편리하게 DB를 사용할 수 있는 좋은 라이브러리이다.






꾸준하게 업데이트 하고 만들고 있는 어플리케이션입니다.


2018/10/21 - [나의 일기] - (리뷰) 시간표 어플리케이션 - 담다

2018/07/15 - [나의 일기] - #담아두다 #일상 #다이어리 #어플리케이션