Kotlin과 함께 Room 라이브러리를 사용하는 Android의 영구 SQLite 데이터베이스
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 데이터베이스로 쉽게 작업할 수 있습니다.
Reference
이 문제에 관하여(Kotlin과 함께 Room 라이브러리를 사용하는 Android의 영구 SQLite 데이터베이스), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/theimpulson/persistent-sqlite-database-on-android-using-room-library-with-kotlin-3bbi텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)