ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 16.[Android] Room정의
    Android 2019. 11. 15. 15:05
    반응형

    Room은 SQLite에 대한 추상화 계층을 가지므로 모든 기능을 사용할 수 있는 라이브러리입니다.

     

    Room은  Database, Entity, DAO라는 3가지의 주요 요소가 존재합니다.

     

    Database는 Database Holder를 포함하고 Data와의 연결을 위한 기본 액세스 지점 역할을 합니다.

    • @Database를 상단에 적어줍니다.
    • RomeDatabase를 확장하는 추상 클래스입니다.
    • Database와 연관된 Entity를 포함시킵니다.
    • 인수가 0인 추상 메서드를 포함하고 DAO를 리턴합니다.
    • 인스턴스로 Room.databaseBuilder()와 Room.inMemoryDatabaseBulider()를 이용하여 Database를 호출합니다.
    @Database(entities = arrayOf(User::class), version = 1)
    abstract class AppDatabase : RoomDatabase() {
        abstract fun userDao(): UserDao
    }
    val db = Room.databaseBuilder(
                applicationContext,
                AppDatabase::class.java, "database-name"
            ).build()

     

    Entity는 Database내의 table을 구성합니다.

    • Entity는 최소 하나의 PrimaryKey를 정의해야 됩니다. ( field 값이 하나만 있어도 @PrimaryKey를 정의해줘야 합니다.)
    • 자동으로 id값을 할당하고 싶다면 @PrimaryKey의 autoGenerate 속성을 이용할 수 있습니다.
    • Entity에 복합 기본키가 있는 경우에는 primaryKeys의 속성을 사용할 수 있습니다.
    • default값으로 table의 이름은 class의 이름으로 설정되어 있습니다. 변경을 원한다면 tableName을 사용하여 변경할 수 있습니다.
    @Entity(tableName = "users") // 테이블 이름 변경시
    • 마찬가지로 table의 열 이름은 field의 이름이 default 값입니다. 변경을 원한다면 @ColunmInfo를 사용하여 변경할 수 있습니다.
    • Entity는 기본적으로 field에 대한 열을 생성합니다 하지만 특정 field를 생성하고 싶지 않다면 @Ignore를 사용하면 됩니다.
    @Entity(primaryKeys = arrayOf("firstName", "lastName")) // PrimaryKey가 여러개일 경우
    data class User(
        @PrimaryKey val uid: Int, // PrimaryKey가 하나 일경우
        @ColumnInfo(name = "first_name") val firstName: String?, // 열의 이름 변경
        @ColumnInfo(name = "last_name") val lastName: String?
         @Ignore val picture: Bitmap? // Ignore fileds
    )

     

    DAO는 Database에 접근할 때 사용되는 메서드들을 구성합니다.

    • @Insert는 data를 삽입할 때 사용합니다.
    • @Update는 data를 변경할 때 사용합니다.
    • @Delete는 data를 삭제할 때 사용합니다.
    • @Query는 읽고 쓰는 작업을 수행합니다. 만약 문제가 생긴다면 컴파일 오류가 발생합니다.
    @Dao
    interface UserDao {
        @Query("SELECT * FROM user")
        fun getAll(): List<User>
    
        @Query("SELECT * FROM user WHERE uid IN (:userIds)")
        fun loadAllByIds(userIds: IntArray): 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(vararg users: User)
        
    	@Update
        fun updateUsers(vararg users: User)
        
        @Delete
        fun delete(user: User)
    }
    반응형

    댓글

Designed by Tistory.