이 글은 Inflearn의 CodeWithJoyce - [쌩초보 가능한 안드로이드 프로그래밍 A-Z : 앱으로 수익 창출까지] 강의를 보고 정리한 내용입니다.
디바이스 내부에 있는 데이터베이스 (웹의 로컬 스토리지 / RN의 AsyncStorage)
인터넷이 끊기더라도 카카오톡에서 채팅방의 메시지를 볼 수 있는 것은 디바이스 내부의 데이터베이스에 해당 채팅 데이터가 저장되어 있기 때문이다.
SQLite에서 추상화 계층을 추가한 것이 Room이다.
=> 쓰기 어려운 것을 쓰기 편하게 만들었다.
RoomDB 덕분에 컴파일타임에 쿼리,엔티티에 문제가 생겼을 때 에러 표시가 떠 미리 잡을 수 있게 해주고, 보일러플레이트 코드를 줄여줌.
속성들의 집합으로 데이터베이스의 테이블 골격에 해당한다.
@Entity
data class ToDoEntity (
@primaryKey(autoGenerate = true) var id : Int? = null,
@ColumnInfo(name="title") val title: String,
@ColumnInfo(name="importance") val importance : Int
)
데이터 베이스에 접근하는 함수를 제공하는 인터페이스
@Dao // 해당 인터페이스가 무엇에 대한 인터페이스인지 알려주기 위해 어노테이션 사용
interface ToDoDao {
@Query("SELECT * FROM ToDoEntity")
fun getAll() : List<ToDoEntity>
@Insert
fun insertToDo(todo:ToDoEntity)
@Delete
fun deleteTodo(todo: ToDoEntity)
}
Annotation (어노테이션)
- 자바(코틀린)코드에 추가할 수 있는 메타데이터의 한 형태
- 클래스 / 인터페이스 / 변수 / 매개변수 등에 사용할 수 있다.
- 코드베이스를 검사하고 컴파일 타임에 사용된다.
- 보일러 플레이트 코드를 줄여 간결한 코드 작성을 가능케 함.
- Room, Retrofit 라이브러리에서 자주 사용된다.
데이터베이스
Class를 DB로 쓰기 위한 3가지 조건
1. DB가 되기 위한 annotation Database를 입력하고, 주생성자 파라미터에 entities와 version을 입력한다.
2. Class가 RoomDB를 상속받아야 함.
3. Dao(Database access object)를 반환하며 인수가 존재하지 않는 추상화 된 함수가 필요하다. 해당 함수로 DB초기화 후 사용.
Only 'const val' can be used in constant expressions
@Database(entities = [ToDoEntity::class,], version = 1) // 조건 1
abstract class AppDatabase: RoomDatabase() { // 조건 2
abstract fun getTodoDao() : ToDoDao // 조건 3
// 싱글턴 패턴을 구현하기 위한 companion Object.
// 클래스의 모든 인스턴스가 공유하는 객체를 만들고 싶을 때 사용한다.
companion object {
private const val databaseName = "db_todo"
private var appDatabase: AppDatabase? = null
fun getInstance(context: Context): AppDatabase? {
if(appDatabase == null) {
appDatabase = Room.databaseBuilder(
context,
AppDatabase::class.java,
databaseName)
.fallbackToDestructiveMigration()
.build()
}
return appDatabase
}
}
}
사용방법
https://developer.android.com/training/data-storage/room?hl=ko
위 공식 사이트대로 모듈단위의 build.gradle 파일을 수정한다.
++android에viewBinding { enable = true },plugins에id 'kotlin-kapt'작성