Kotlin과 함께 Room 라이브러리를 사용하는 Android의 영구 SQLite 데이터베이스

7277 단어
영구 저장소는 앱에서 중요한 요소입니다. 애플리케이션 수명 주기에 관계없이 지속되는 데이터를 로컬에 저장할 수 있습니다.

Room 라이브러리는 SQLite에 대한 추상화 계층을 제공하므로 Android에서 SQLite 데이터베이스를 더 쉽게 유지 관리하고 사용할 수 있습니다. 이 공간은 또한 SQL 쿼리, 주석 지원, 간소화된 데이터베이스 마이그레이션 경로에 대한 컴파일 타임 검증을 제공하여 훨씬 더 좋습니다. Android Jetpack Framework의 일부이며 SQLite 라이브러리보다 권장됩니다.

종속성



Room 라이브러리를 사용하려면 앱 모듈의 build.gradle 파일에 다음 종속성을 추가하십시오.

dependencies {
    // Coroutines
    def coroutines_version = "1.4.2"
    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutines_version"
    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutines_version"

    // ROOM
    def room_version = "2.2.6"
    kapt "androidx.room:room-compiler:$room_version"
    implementation "androidx.room:room-runtime:$room_version"
    implementation "androidx.room:room-ktx:$room_version"
}


또한 아직 수행하지 않은 경우 주석 지원을 활성화합니다.

plugins {
    id 'kotlin-kapt'
}


마지막으로 룸 라이브러리의 증분 주석 지원을 활성화해야 합니다.

android {
    defaultConfig {
        javaCompileOptions {
            annotationProcessorOptions {
                arguments += [
                        "room.incremental":"true"]
            }
        }
    }
}


You can check the complete list of arguments supported and their use cases on developer.android.com



용법



룸 라이브러리를 사용하기 위해 database 라는 관련된 모든 파일을 저장할 새 패키지를 만듭니다. 다음과 같은 3개의 파일을 호스팅합니다.
  • User.kt 여기에는 데이터베이스에 삽입할 사용자 개체의 데이터 클래스가 포함됩니다
  • .
  • UserDAO.kt 삽입, 업데이트 등과 같은 데이터베이스를 통해 수행할 메서드를 호스팅하는 인터페이스를 포함하고
  • UserDatabase.kt 인스턴스를 싱글톤으로 만들기 위해 컴패니언 개체와 함께 데이터베이스의 추상 클래스를 호스팅합니다.

  • Database instance created must be a singleton as recommended by official documentation on developer.android.com



    사용자 구현



    데이터베이스에 저장할 인수를 사용하는 User라는 새 데이터 클래스를 만듭니다. 이 클래스에 @Entity 주석을 추가하십시오. 원하는 경우 @PrimaryKey(autoGenerate = true) 주석을 사용하여 데이터베이스에 대한 자동 생성 ID를 가질 수 있습니다. 시간과 노력을 절약할 수 있어 추천합니다.

    내 경우에는 클래스가 어떻게 보이는지 다음과 같습니다.

    package dev.theimpulson.roomexample.database
    
    import androidx.room.Entity
    import androidx.room.PrimaryKey
    
    @Entity
    data class User(
        val firstName: String,
        val lastName: String,
        val age: Int,
        @PrimaryKey(autoGenerate = true)
        val id: Int? = null
    )
    


    UserDAO 구현



    DAO는 Database Access Object의 약자입니다. UserDAO 라는 새 인터페이스를 만듭니다. 이 인터페이스에 @Dao 주석을 추가하십시오. 이 인터페이스는 예를 들어 개체 삽입, 삭제, 업데이트, 쿼리와 같이 데이터베이스에서 수행하려는 기능을 보유합니다. 수행하는 작업과 동일한 기능에 주석을 추가합니다.

    한 가지 중요한 점은 이러한 함수가 코루틴 스레드 내에서만 실행되도록 하려면 이러한 함수를 suspend로 표시해야 한다는 것입니다. 그렇지 않으면 UI 차단 코드와 관련하여 런타임에 오류가 발생합니다.

    내 경우에는 UserDAO.kt가 다음과 같이 보입니다.

    package dev.theimpulson.roomexample.database
    
    import androidx.room.*
    
    @Dao
    interface UserDAO {
    
        @Insert
        suspend fun insert(user: User)
    
        @Query("SELECT * FROM user")
        suspend fun queryAll(): List<User>
    
        @Update
        suspend fun update(user: User)
    
        @Delete
        suspend fun delete(user: User)
    }
    


    Query annotation requires a value argument which must be an SQL command to query on the database.



    사용자 데이터베이스 구현



    인스턴스화하는 동안 RoomDatabase로 확장되는 UserDatabase라는 새 추상 클래스를 만듭니다. 이 클래스는 인수가 포함된 @Database 주석으로 주석을 달아야 합니다.

  • 엔티티의 목록을 취하는 entities,
  • version는 데이터베이스 버전이고
  • exportSchema 코드베이스에서 스키마의 버전 기록을 활성화합니다.

  • 클래스에는 DAO와 동일한 유형의 추상 함수가 있어야 합니다.

    이 클래스에서 null로 설정된 클래스 유형의 변수를 보유할 새companion object를 만들고 클래스 인스턴스를 가져오고 제거하는 2개의 함수를 만듭니다.

    데이터베이스의 인스턴스를 가져오기 위해 컨텍스트, 현재 클래스 및 데이터베이스 이름이라는 3개의 인수가 필요한 Room.databaseBuilder()를 사용합니다. 또한 실제로 데이터베이스의 인스턴스를 빌드하기 위해 build() 메서드를 호출해야 합니다.

    내 경우에는 UserDatabase.kt가 어떻게 보이는지 다음과 같습니다.

    package dev.theimpulson.roomexample.database
    
    import android.content.Context
    import androidx.room.Database
    import androidx.room.Room
    import androidx.room.RoomDatabase
    
    @Database(entities = [User::class], version = 1, exportSchema = false)
    abstract class UserDatabase: RoomDatabase() {
        abstract fun userDao(): UserDAO
    
        companion object {
            private var INSTANCE: UserDatabase? = null
    
            fun getInstance(context: Context): UserDatabase {
                return if (INSTANCE == null) {
                    Room.databaseBuilder(context, UserDatabase::class.java, "user_database").build()
                } else {
                    INSTANCE!!
                }
            }
    
            fun destroyInstance() {
                INSTANCE = null
            }
        }
    }
    


    데이터베이스 사용



    데이터베이스를 사용하려면 데이터베이스의 인스턴스를 만들고 코루틴 범위에서 함수를 호출하기만 하면 됩니다. 쿼리 함수의 응답을 기록하여 데이터베이스의 변경 사항도 볼 수 있습니다.

    예를 들어 내 MainActivity.kt 파일에서 이러한 작업을 수행할 것입니다. 다음과 같이 표시됩니다.

    package dev.theimpulson.roomexample
    
    import android.os.Bundle
    import android.util.Log
    import androidx.appcompat.app.AppCompatActivity
    import dev.theimpulson.roomexample.database.User
    import dev.theimpulson.roomexample.database.UserDatabase
    import kotlinx.coroutines.GlobalScope
    import kotlinx.coroutines.launch
    
    class MainActivity : AppCompatActivity() {
        private var TAG = "MainActivity"
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
    
            val db = UserDatabase.getInstance(this).userDao()
    
            GlobalScope.launch {
                db.insert(User("Tom", "Clancy", 30))
                val fetch = db.queryAll()
                Log.d(TAG, fetch.toString())
            }
    
            GlobalScope.launch {
                db.update(User(firstName = "Jack", lastName = "Ryan", age = 25, id = 4))
                val fetch = db.queryAll()
                Log.d(TAG, fetch.toString())
            }
    
            GlobalScope.launch {
                db.delete(User(firstName = "Aayush", lastName = "Gupta", age = 22, id = 1))
                val fetch = db.queryAll()
                Log.d(TAG, fetch.toString())
            }
        }
    }
    


    그리고 그게 다야. 이제 룸 라이브러리를 사용하여 컴파일 시간 확인을 통해 많은 상용구 코드를 작성하지 않고도 Android에서 SQLite 데이터베이스로 쉽게 작업할 수 있습니다.

    좋은 웹페이지 즐겨찾기