RoomDB ?
RoomDB
는 안드로이드에서 SQLite 데이터베이스를 쉽게 사용할 수 있도록 도와주는 영구 저장소 라이브러리입니다.
일반적인 사용 사례로 네트워크에 액세스할 수 없을 때도 사용자가 오프라인 상태로 계속 콘텐츠를 탐색할 수 있도록 관련 데이터를 캐시하는 것입니다.
Room에는 다음 3가지 주요 구성요소가 있습니다.
데이터베이스 클래스
는 데이터베이스와 연결된 DAO 인스턴스
를 앱에 제공합니다. 그러면 앱은 DAO를 사용하여 데이터베이스의 데이터를 연결된 데이터 항목 객체의 인스턴스로 검색할 수 있게 됩니다. 앱은 정의된 데이터 항목을 사용하여 상응하는 테이블의 행을 업데이트하거나 삽입할 새 행을 만들 수도 있습니다. 그림 1은 다양한 Room 구성요소 간 관계를 보여줍니다.
예제
dependencies {
val room_version = "2.5.0"
implementation("androidx.room:room-runtime:$room_version")
annotationProcessor("androidx.room:room-compiler:$room_version")
// To use Kotlin annotation processing tool (kapt)
kapt("androidx.room:room-compiler:$room_version")
// To use Kotlin Symbol Processing (KSP)
ksp("androidx.room:room-compiler:$room_version")
// optional - Kotlin Extensions and Coroutines support for Room
implementation("androidx.room:room-ktx:$room_version")
// optional - RxJava2 support for Room
implementation("androidx.room:room-rxjava2:$room_version")
// optional - RxJava3 support for Room
implementation("androidx.room:room-rxjava3:$room_version")
// optional - Guava support for Room, including Optional and ListenableFuture
implementation("androidx.room:room-guava:$room_version")
// optional - Test helpers
testImplementation("androidx.room:room-testing:$room_version")
// optional - Paging 3 Integration
implementation("androidx.room:room-paging:$room_version")
}
@Entity(tableName = "interest_coin")
data class InterestCoinEntity(
@PrimaryKey(autoGenerate = true)
val id: Int,
val coin_name: String
)
Room 항목을 @Entity
주석이 달린 클래스로 정의합니다. Room 항목에는 기본 키를 구성하는 하나 이상의 열을 비롯하여 데이터베이스의 상응하는 테이블에 있는 각 열의 필드가 포함되어 있습니다.
@Dao
interface InterestCoinDAO {
@Query("SELECT * FROM interest_coin")
fun getAlldata() : Flow<List<InterestCoinEntity>>
@Insert(onConflict = OnConflictStrategy.IGNORE)
fun insert(interestCoinEntity: InterestCoinEntity)
@Delete
fun delete(interestCoinEntity: InterestCoinEntity)
}
DAO를 인터페이스나 추상 클래스로 정의할 수 있습니다. 위 예제에서는 인터페이스를 사용합니다. 어느 경우는 @Dao
주석을 달아야합니다.
메서드는 편의 메서드
, 쿼리 메서드
두 가지 유형으로 정의할 수 있습니다. 위 예제에서는 쿼리 메서드
를 활용했습니다.
@Database(entities = [InterestCoinEntity::class], version = 1)
abstract class CoinInfoDatabase : RoomDatabase() {
abstract fun interestCoinDAO(): InterestCoinDAO
companion object {
@Volatile
private var INSTANCE: CoinInfoDatabase? = null
fun getDatabase(context: Context): CoinInfoDatabase {
return INSTANCE ?: synchronized(this) {
val instance = Room.databaseBuilder(
context.applicationContext,
CoinInfoDatabase::class.java,
"coin_database"
)
.fallbackToDestructiveMigration()
.build()
INSTANCE = instance
instance
}
}
}
}
데이터베이스를 보유할 Database 클래스를 정의합니다. 이 클래스는 데이터베이스 구성을 정의하고 영구데이터에 대한 앱의 기본 액세스 포인트 역할을 합니다.
class DBRepository {
val context = App.context()
val db = CoinInfoDatabase.getDatabase(context)
// InterestCoin
fun getAllInterestCoinData() = db.interestCoinDAO().getAlldata()
fun insertInterestCoinData(interestCoinEntity: InterestCoinEntity) = db.interestCoinDAO().insert(interestCoinEntity)
fun deleteInterestCoinData(interestCoinEntity: InterestCoinEntity) = db.interestCoinDAO().delete(interestCoinEntity)
}
다음과 같이 CoinInfoDatabase의 추상메서드를 사용하여 DAO 인스턴스를 가져와서 데이터베이스와 상호작용할 수 있습니다.
더 자세한 내용은 아래 안드로이드 개발자 문서를 참고
https://developer.android.com/training/data-storage/room?hl=ko