XML 포맷의 텍스트 파일에 키-값 세트로 정보를 저장.
SharedPreferences 클래스
getSharedPreferences
(name, mode)val sharedPref = activity?.getSharedPreferences(
getString(R.string.preference_file_key), Context.MODE_PRIVATE)
putBoolean
putFloat
putInt
putLong
putString
putStingset
getPreferences
- 한개만 저장할 일이 없어서 잘 안씀val sharedPref = activity?.getPreferences(Context.MODE_PRIVATE)
간단히 말하면 기존에 테이블 쓰다가 추가할게 생겨서 테이블을 변경시키면
이전까지 있던 데이터들이 에러가 날테니 Migration으로 버전을 나눠줌
포함되는 Entity들과 데이터베이스 버전(version)을 @Database annotation에 지정함 버전이 중요 (만약 테이블을 추가해야된다면 테이블이 추가된채 앱을 업데이트할때 기존에 깔려있던 앱 들은 데이터베이스가 업데이트가 안되있어서 에러가남 migration을 이용해 테이블을 추가한다거나 변경함)
version이 기존에 저장되어 있는 데이터베이스보다 높으면, 데이터베이스를 open할 때 migration을 수행하게 됨
Migration 수행 방법은 RoomDatabase 객체의 addMigration() 메소드를 통해 알려줌
여러개의 Migration 지정 가능
Room.databaseBuilder(...).addMigrations(MIGRATION_1_2, MIGRATION_2_3)
private val MIGRATION_1_2 = object : Migration(1, 2) { // version 1 -> 2
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL("ALTER TABLE student_table ADD COLUMN last_update INTEGER")
//ALTER TABLE 테이블 변경하는거, 컬럼을 추가한다
}
}
private val MIGRATION_2_3 = object : Migration(2, 3) { // version 2 -> 3
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL("ALTER TABLE class_table ADD COLUMN last_update INTEGER")
}
}
DAO는 쿼리언어로
Room의 애노테이션 프로세서를 사용하기 위해서는 room-compiler 의존성을 추가해야 함
id ("kotlin-kapt")
...
dependencies {
// Room 관련 의존성
implementation "androidx.room:room-runtime:2.6.1" // Room 라이브러리
kapt "androidx.room:room-compiler:2.6.1" // Room의 애노테이션 프로세서
Room은 기본적으로 메인 스레드에서의 데이터베이스 작업을 차단함
따라서 데이터베이스 작업을 백그라운드 스레드에서 수행해야한다
viewModelScope.launch(Dispatchers.IO) {
// 여기서 데이터베이스 작업 수행
}
코루틴을 사용하자
LiveData 객체의 setValue 메서드가 백그라운드 스레드에서 호출되었을 때도 문제가 생긴다
postValue 사용하자
테이블 확인은 View -> ToolWindows -> AppInspection