-
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( 사용자 정의 클래스를 통하여 데이터 베이스를 조작 )