업데이트:

카테고리:

/

태그: ,

Room

SQLite 데이터베이스의 추상적 레이어

간단하게 DB를 구성, 설정, 상호작용할 수 있음

  1. Entity 제작

    Entity : DB에 저장하기 위한 객체, 속성, 유형 = table / Room과 매핑되어 DB와 상호작용

    Query : DB에 대한 요청, 테이블 병합, 데이터에 대한 액션을 수행

     @Entity(tableName="Example")
     data Class example (
     	@PrimaryKey(autoGenerate = ture)
     	val key: Int
     	@ColumnInfo(name="field")
     	val name: String
     )
    
  2. DAO (data access object) 제작

     @Dao
     interface ExampleDao {
     	@Insert
     	fun addData()
     	@Update
     	fun editData()
     	@Query("쿼리문")
     	fun get(key:Long): example?
     }
    
  3. Room 제작

    • publice abstract class로 제작, Roomdatabase를 상속
    • @Database 사용, 인자로 entities, version, exportSchema가 필요
    • companion object 안에는 Dao에서 정의한 반환값이 메서드 / 속성
      • Instance가 들어가야 함, 반복적으로 DB를 오픈하면 비용이 올라감
      • @Valatile 를 사용하여 메인메모리에 데이터를 저장할 수 있다. 단, 변경이 일어나면 다른 스레드에도 알려야한다.
    • Room instance는 1개 존재, 싱글톤으로 있어야 함
     @Database(entities=[User::class], version=1)
     abstract class SleepDatabase: RoomDatabase() {
     	abstract fun userDao(): UserDao
        	
     	companion object() {
     		@Volatile
     		private var INSTANCE: AppDatabase? = null
        
     		fun getInstance9context: Context): SleepDatabase {
     			synchronized(this) {
     				var instance = INSTANCE
        
     				if (instance == null) {
     					instance = Room.databaseBuilder (
     						context.applicatonContext, 
     						SleepDatabase::class.java,
     						"sleep_data_base").build()
        
     					INSTANCE = instance
     				}
     			return INSTANCE
     		}
     }
    

    room을 생성할 때 applicationContext 를 쓰는 이유는 Room DB는 앱 내에 하나만 존재 가능하기에

Coroutines

비동기적으로 실행되는 코드를 간소화하기 위해 만들어진 동적설계패턴

  1. 경량: 실행하지 않는 스레드를 차단하는 정지를 지원, 단일 스레드에서 많은 코루틴이 실행
  2. 메모리 누수 감소: 동시 실행을 사용하여 범위 내에서 작업 실행
  3. 기본으로 제공되는 취소 자원: 실행 중인 코루틴 계층 구조를 통해 자동으로 취소 전달

논블록으로 실행되고, 정지함수를 지원하기 때문에 연속적으로 실행할 수 있음

사용하기 위해는 3가지 요소가 필요함

  1. Job: 코루틴을 취소하기 위해 사용, 부모-자식 계층에서 부모의 작업이 취소 되면, 자식의 작업도 취소됨
  2. Dispatcher: 어느 스레드에서 실행될 것인지 전송
  3. Scope: 코루틴이 실행되는 곳에 따라 결정, Jop + Dispatcher의 형태

⚠️주의 : Retrofit과 통신하거나, 값이 급작스럽게 바뀌는 경우는 메인 스레드에서 진행하면 에러가 날 수 있으니 시간이 오래걸리는 작업은 IODispatche에서 진행해야됨

그래서 viewModel 에서 데이터 변경이 일어나면 example.text 이 아니라 postValue로 값을 보내줘야 정상 수정된다. 단, postValue로 보낸 값중 마지막이 저장된다.