본문 바로가기

개발 일기/Android

[Kotlin] 간단 메모장 만들기2 #Room

- Room 사용하기

 

 

몇 가지 추가를 해줘야 한다.

 

//kapt 추가
apply plugin: 'kotlin-kapt'

dependencies {
    //Room 추가
    def room_version = "2.2.3"
    implementation "androidx.room:room-runtime:$room_version"
    kapt "androidx.room:room-compiler:$room_version" // For Kotlin use kapt instead of annotationProcessor
    // optional - Kotlin Extensions and Coroutines support for Room
    implementation "androidx.room:room-ktx:$room_version"
    // optional - RxJava support for Room
    implementation "androidx.room:room-rxjava2:$room_version"
    // optional - Guava support for Room, including Optional and ListenableFuture
    implementation "androidx.room:room-guava:$room_version"
    // Test helpers
    testImplementation "androidx.room:room-testing:$room_version"
   }

 

그리고 Room을 위해 3가지 class를 만들었다.

 

Diaty.kt

@Entity(tableName = "diary")
data class Diary (
    @PrimaryKey(autoGenerate = true) val _id: Int,
    @ColumnInfo(name = "title") val title: String?,
    @ColumnInfo(name = "content") val content: String?
)

Mongo에서 스키마를 만들듯 Entity를 만들었다.

 

DiaryDao.kt

 

@Dao
interface DiaryDao {

    @Insert(onConflict = OnConflictStrategy.REPLACE)//id가 같을시 대체된다고 함.
    fun insert(diary: Diary)

    @Query("SELECT * FROM diary")
    fun getAll(): List<Diary>

    @Query("SELECT * FROM diary WHERE _id IN (:diaryIds)")
    fun loadAllByIds(diaryIds: IntArray): List<Diary>

    @Query("SELECT * FROM diary WHERE title LIKE :title AND " +
            "content LIKE :content LIMIT 1")
    fun findByTitle_content(title: String, content: String): Diary

    @Insert
    fun insertAll(vararg diaries: Diary)

    @Delete
    fun delete(diary: Diary)
}

 

기본적인 기능을 하는 sql문을 작성했다.

 

AppDatabase.kt

 

@Database(entities = arrayOf(Diary::class), version = 1)

abstract class AppDatabase : RoomDatabase() {

    abstract fun diaryDao(): DiaryDao

    companion object {
        private var INSTANCE: AppDatabase? = null

        fun getInstance(context: Context): AppDatabase? {
            if (INSTANCE == null) {
                synchronized(AppDatabase::class) {
                    INSTANCE = Room.databaseBuilder(
                        context.applicationContext,
                        AppDatabase::class.java,
                        "dbname.db"
                    ).build()
                }
            }
            return INSTANCE
        }
        fun destoryInstance() {
            INSTANCE = null
        }
    }
}

 

Room은 한 개 만들어 놓고 여러 번 사용하기 때문에 싱글톤으로 구현하였다.

 

그리고 사용할 때는 비동기 처리를 해주어야한다. 이건 3편에 작성하기로 하자.

 

참고: https://developer.android.com/jetpack/androidx/releases/room

 

방  |  Android 개발자  |  Android Developers

Room 지속성 라이브러리는 SQLite를 완벽히 활용하면서 강력한 데이터베이스 액세스를 지원하는 추상화 계층을 SQLite에 제공합니다. 최근 업데이트 현재 안정화 릴리스 다음 출시 후보 베타 릴리스 알파 릴리스2019년 11월 20일 2.2.2 - - - 종속성 선언 Room에 종속성을 추가하려면 프로젝트에 Google Maven 저장소를 추가해야 합니다. 자세한 내용은 Google Maven 저장소를 읽어보세요. Room의 종속성에는 Room 이전

developer.android.com