ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 1-2. Room 데이터베이스를 통한 메모 데이터베이스 작성
    카테고리 없음 2021. 9. 14. 17:42

    메모를 관리하기 위한 데이터베이스 생성 및 조작

    Room을 활용하는 법은 reference 참고

     

    추상 클래스 또는 인터페이스로 선언하면 Room이 알아서 구현해준다.

    Room은 쿼리문법, 테이블 이름, 데이터베이스 이름등등을 컴파일 시점에서 체크가 되므로 runtime중 쿼리실수등으로 인한 crash가 발생하지 않는다.

     

    • Memo.class
    import androidx.room.ColumnInfo
    import androidx.room.Entity
    import androidx.room.PrimaryKey
    
    @Entity(tableName = "memo")
    data class Memo(
    
        @PrimaryKey(autoGenerate = true) var id: Long?,
    
        @ColumnInfo var title: String,
        @ColumnInfo var content: String,
    
        //CURRENT_TIMESTAMP를 문자열로 넣을 경우
        //defaultValue = "'CURRENT_TIMESTAMP'" <- 실제 문자열이 들어감
    
        @ColumnInfo(defaultValue = "CURRENT_TIMESTAMP") var created: String?,
        @ColumnInfo(defaultValue = "CURRENT_TIMESTAMP") var modified: String?,
    
    ) {
        constructor() : this(null, "", "", null, null)
    }

    Memo클래스는 데이터베이스의 테이블에 해당한다. @Entity를 통하여 테이블이라는 것과 이름을 정의한다.

    다양한 Room 어노테이션을 활용하여 테이블의 이름 정의, 컬럼의 이름 정의, 컬럼의 기본값등을 설정할 수 있다.

     

    • MemoDao.class
    import androidx.room.*
    import androidx.room.OnConflictStrategy.REPLACE
    
    @Dao
    abstract class MemoDao {
    
        @Query(value = "select * from memo") //만들어진 순서대로
        abstract fun querySelectAllDefault(): List<Memo>
    
        @Query("select * from memo order by id desc") //최근날짜
        abstract fun querySelectAllOrderByLast(): List<Memo>
    
        @Query("select * from memo order by modified") //변경된 순서대로
        abstract fun querySelectAllOrderByModified(): List<Memo>
    
        @Query("insert into memo(title,content) values(:title,:content)")
        abstract fun insert(title: String, content: String)
    
    //    @Query("insert into memo(title,content) values(:title,:content)")
    //    abstract fun insert(title: String, content: String)
    
    //    @Insert(onConflict = REPLACE)
    //    abstract fun insert(memo: Memo)
    
        @Delete()
        abstract fun delete(memo: Memo)
    
        @Update()
        abstract fun update(memo: Memo)
    }

    @Dao - Data Access Object

    Dao인스턴스의 다양한 메서드를 통하여 데이터 베이스를 조회, 쿼리, 삭제, 업데이트등등이 가능하다.

    데이터를 조회하는 경우 리턴값을 리스트, LiveData도 가능하다.

     

    Memo클래스에서 정의해놓은 컬럼의 기본값 어노테이션을 정의하였다.

    @Query와 @Insert는 row를 넣을 때 기본값이 설정되는 유무가 다르다.

     

    • MemoRoomDatabase.class
    import android.content.Context
    import androidx.room.Database
    import androidx.room.Room
    import androidx.room.RoomDatabase
    
    @Database(entities = [Memo::class], version = 1)
    abstract class MemoRoomDatabase : RoomDatabase() {
    
        abstract fun memoDao(): MemoDao
    
        companion object {
            private var INSTANCE: MemoRoomDatabase? = null
    
            fun getInstance(context: Context): MemoRoomDatabase {
                if (INSTANCE == null) {
                    synchronized(MemoRoomDatabase::class) {
                        INSTANCE = Room.databaseBuilder(context.applicationContext,
                            MemoRoomDatabase::class.java, "memo.db")
    //                    .fallbackToDestructiveMigration()
    //                    .build()
                            .build()
                    }
                }
                return INSTANCE!!
            }
    
            fun destroyInstance() {
                if (INSTANCE != null) {
                    synchronized(MemoRoomDatabase::class) {
                        INSTANCE =null
                    }
                }
            }
    
        }
    }

    @Database로 Room 데이터베이스 명시, 포함되는 테이블 정의, 데이터 베이스 버전 1

    memoDao()메서드로 Dao를 가져와 이 Dao참조를 통해 Dao내부의 데이터를 조회하는 메서드를 사용할 수 있다.

     

    Room데이터베이스를 가져오는 것은 값비싼 과정이므로 메인 스레드에서 데이터베이스를 초기화하면 안된다. 또한 에러가 발생할 수 있다. 값이 비싸기 때문에 보통 싱글톤으로 생성한다.

     

    db파일을 파일로 옮기는 것은 파일 read, write 권한등을 얻어와 하면 되는데 나중에 해보려고 한다.

     

    다음 포스팅- RepositoryMemo( 사용자 정의 클래스를 통하여 데이터 베이스를 조작 ) 

    댓글

Designed by Tistory.