Android Room&Coroutine
업데이트:
카테고리: Android
/Room
SQLite 데이터베이스의 추상적 레이어
간단하게 DB를 구성, 설정, 상호작용할 수 있음
-
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 )
-
DAO (data access object) 제작
@Dao interface ExampleDao { @Insert fun addData() @Update fun editData() @Query("쿼리문") fun get(key:Long): example? }
-
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
비동기적으로 실행되는 코드를 간소화하기 위해 만들어진 동적설계패턴
- 경량: 실행하지 않는 스레드를 차단하는 정지를 지원, 단일 스레드에서 많은 코루틴이 실행
- 메모리 누수 감소: 동시 실행을 사용하여 범위 내에서 작업 실행
- 기본으로 제공되는 취소 자원: 실행 중인 코루틴 계층 구조를 통해 자동으로 취소 전달
논블록으로 실행되고, 정지함수를 지원하기 때문에 연속적으로 실행할 수 있음
사용하기 위해는 3가지 요소가 필요함
- Job: 코루틴을 취소하기 위해 사용, 부모-자식 계층에서 부모의 작업이 취소 되면, 자식의 작업도 취소됨
- Dispatcher: 어느 스레드에서 실행될 것인지 전송
- Scope: 코루틴이 실행되는 곳에 따라 결정, Jop + Dispatcher의 형태
⚠️주의 : Retrofit과 통신하거나, 값이 급작스럽게 바뀌는 경우는 메인 스레드에서 진행하면 에러가 날 수 있으니 시간이 오래걸리는 작업은 IODispatche에서 진행해야됨
그래서 viewModel 에서 데이터 변경이 일어나면 example.text
이 아니라 postValue로 값을 보내줘야 정상 수정된다. 단, postValue로 보낸 값중 마지막이 저장된다.