Room
안드로이드에서 SQLite
의 기능을 모두 쉽게 사용할 수 있도록 도와주는 라이브러리이다.
Entity
DB
안에 있는 테이블을 객체로 나타낸 것으로, 데이터 모델 클래스를 의미한다.
/**
* Entity 는 DB 에 저장될 데이터의 형식으로 적어도 하나 이상의 Primary Key 가 필요하다.
* @PrimaryKey(autoGenerate = true) 를 이용해 자동으로 생성되게 하는 것도 가능하다.
*/
@Entity(tableName = "table")
@TypeConverters(DateConverter::class)
data class BookMark(
@PrimaryKey(autoGenerate = true)
val id: Int = 0,
@ColumnInfo(name = "title")
val title: String,
@ColumnInfo(name = "description")
val description: String,
)
DAO(Database Access Object)
DB
에 접근해서 수행할 작업을 정의한 클래스이다.
/**
* DAO 는 DB 를 통해 수행할 작업을 정의한 클래스이다.
* 데이터의 삽입, 수정, 삭제 작업이나 저장된 데이터를 불러오는 작업 등을 함수 형태로 정의한다.
* OnConflictStrategy 는 Primary Key 가 겹칠 경우의 정책을 설정하는 부분이다.
*/
@Dao
interface TableDao {
@Query("SELECT * FROM table ORDER BY created ASC")
fun findAll(): DataSource.Factory<Int, BookMark>
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insert(bookMark: BookMark)
@Delete
fun delete(bookMark: BookMark)
}
Database
RoomDatabase
를 상속하는 추상 클래스로, 테이블과 버전을 정의한다.
@Database(
entities = [TableEntity::class],
version = DB_VERSION,
exportSchema = false
)
abstract class AppDatabase: RoomDatabase() {
abstract fun tableDao(): TableDao
companion object {
const val DB_VERSION = 1
private const val DB_NAME = "app.db"
private var appDatabase: AppDatabase? = null
/**
* synchronized 는 특정 스레드가 이미 자원을 사용하는 중이면
* 나머지 스레드의 접근을 막아 데이터의 안정성을 보장
*/
fun instance(context: Context): AppDatabase {
return appDatabase ?: synchronized(this) {
appDatabase ?: Room.databaseBuilder(
context.applicationContext,
AppDatabase::class.java,
DB_NAME
).fallbackToDestructiveMigration()
.build()
.also {
appDatabase = it
}
}
}
}
}