android studio

Room을 사용하여 로컬 데이터베이스에 데이터 저장

즌탱 2022. 1. 10. 18:48

 

 

 

앱에서 Room을 사용하려면 앱의 build.gradle 파일에 다음 종속 항목을 추가한다.

 

plugins {
     id 'kotlin-kapt'
}

dependencies {
     implementation "androidx.room:room-runtime:$roomVersion"
     kapt "androidx.room:room-compiler:$roomVersion"

 


 

Room 세가지 주요 구성요소

 

  • 데이터베이스 : 앱의 지속적인 관계형 데이터의 기본 연결을 위한 기본 엑세스 포인트 역할을 한다.

                          @Database 로 주석이 지정된 클래스는 다음의 조건을 충족해야 한다.

                             - RoomDatebase 를 확정하는 추상클래스여야 한다.

                             - 주석 내에 데이터베이스와 연결된 항목의 목록을 포함해야 한다.

                             - 인수가 0개이며 @Dao 로 주석이 지정된 클래스를 반환하는 추상 메서드를 포함해야 한다.      

  • 항목 (data class) : 데이터베이스 내의 테이블을 나타낸다.
  • Dao : 데이터베이스에 액세스하는 데 사용되는 메서드가 포함되어 있다.

 

 

앱은 Room 데이터베이스를 사용하여 데이터베이스와 연결된 데이터 액세스 개체 또는 DAO를 가져온다. 그런 다음 앱은 각 DAO를 사용하여 데이터베이스에서 항목(data class)을 가져오고 항목의 변경사항을 다시 데이터베이스에 저장한다. 마지막으로 앱의 항목을 사용하여 데이터베이스 내의 테이블 열(column)에 해당하는 값을 가져오고 설정한다.

 

 

 


 

User (항목 : data class)
@Entity
data class User(  // 기본적으로 Room의 클래스 이름은 데이터베이스 테이블 이름으로 사용한다.
     @PrimaryKey val uid: Int,
     @ColumnInfo(name = "first_name") val firstName: String?
     @ColumnInfo(name = "last_name") val lastName: String?

 

Room 지속성 라이브러리를 사용할 때 관련 필드 세트를 항목(데이터베이스 내의 테이블)으로 정의한다.

각 항목의 경우 연결된 Database 객체 내에 테이블을 만들어 항목으로 보유한다.

Database 클래스의 entites 배열을 통해 항목 클래스를 참조해야 한다.

각 항목은 하나 이상의 필드를 기본 키로 정의해야 한다. 필드가 하나만 있는 경우에도 @Primarykey 주석을 사용하여 필드에 주석을 달아야 한다.

※ 항목에 자동 ID를 할당하게 하려면 @PrimaryKey의 autoGenerate 속성을 설정하면 된다.

 

 

테이블의 이름을 다르게 지정하려면 @Entity 주석의 tableName 속성을 설정하면 된다.

tableName 속성과 마찬가지로 Room은 필드 이름을 데이터베이스의 열 이름으로 사용한다.열 이름을 다르게 지정하려면 @ColumnInfo 주석을 필드에 추가한다.

@Entity(tableName = "users")
data class User (
     @PrimaryKey val uid: Int,
     @ColumnInfo(name = "first_name") val firstName: String?
     @ColumnInfo(name = "last_name") val lastName: String?
)

 

 

User Dao
@Dao
interface UserDao {
     @Query("SELECT * FROM user")
     fun getAll(): List<User>

     @Query("SELECT * FROM user WHERE first_name LIKE :first AND" + "last_name LIKE :last LIMIT 1"
     fun findByName(first: String, last: String): User

     @Insert
     fun insertAll(user: User)

     @Delete
     fun delete(user: User)

 

 

AppDatabase
@Database(entities = [User::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
     abstract fun userDao(): UserDao
}
​

 


 

위의 파일들을 생성한 후 다음 코드를 사용하여 생성한 데이터베이스 인스턴스를 가져온다.

val db = Room.databaseBuilder(
             applicationContext,
             AppDatabase::class.java, 
             "database-name"
          ).build()