Side Project - Book Review App
인터파크 도서 Open API를 사용해서 베스트 셀러 목록을 보여주고 검색을 통해 책을 검색하는 도서 리뷰 앱 프로젝트
학습 회고
오늘은 검색 히스토리 RecyclerView를 띄우기 위해 검색한 키워드들을 저장하는 DB를 Room 라이브러리를 사용해서 만들었다.
오늘 공부한 내용
- Room 라이브러리
도서를 검색한 히스토리를 앱 내부 저장소에 저장하기 위해서 Room 라이브러리를 사용하였다.
Room 구성요소는 다음과 같다.
- 데이터베이스 클래스 AppDatabase
데이터베이스를 보유하고 내부저장소에 저장된 데이터를 사용하기 위한 기본 액세스 포인트 역할을 하는 AppDatabase 클래스를 만들어 준다. @Database Annotation에 entities를 포함해야 하고, DAO 클래스의 인스턴스를 반환하는 추상 메서드를 정의해야 한다.
@Database(entities = [History::class], version = 1)
abstract class AppDatabase: RoomDatabase() {
abstract fun historyDao(): HistoryDao
}
- 데이터 항목 Entity
데이터베이스 테이블과 각 필드를 정의하는 데이터 모델 클래스를 작성한다. 기본적으로 클래스 이름이 테이블 이름이 된다.
@Entity
data class History(
@PrimaryKey val uid: Int?,
@ColumnInfo(name = "keyword") val keyword: String?
)
- 데이터 액세스 객체 DAO
데이터베이스의 데이터를 쿼리하고 CRUD하기 위해 사용할 메서드를 정의한다.
@Dao
interface HistoryDao {
@Query("SELECT * FROM history")
fun getAll(): List<History>
@Insert
fun insertHistory(history: History)
@Query("DELETE FROM history WHERE keyword == :keyword")
fun delete(keyword: String)
}
검색창 EditText를 클릭하였을 때, 이전에 검색한 히스토리를 띄우기 위해서 모든 히스토리 목록을 가져오는 getAll() 쿼리 메서드를 @Query Annotation을 사용하여 정의하였다.
또한, 새로운 키워드로 검색하였을 때 히스토리에 데이터를 추가하기 위해 @insert Annotation을 사용하여 SQL문을 작성하지 않고 insertHistory() 메서드를 정의하였다.
검색 히스토리의 x버튼을 클릭하면 해당 키워드를 모두 삭제하기 위해 @Query Annotation을 사용해서 delete() 메서드를 정의하였다.
- Thread를 사용해서 데이터베이스 작업 수행하기
데이터베이스 쿼리나 CROUD 작업을 수행하기 위해서 Thread를 생성한다.
데이터베이스 쿼리 결과를 UI에 적용하기 위해서 메인쓰레드에게 Runnable 객체를 전달하는 runOnUiThread를 통해 UI를 업데이트 한다.
Thread {
val keywords = db.historyDao().getAll().reversed()
runOnUiThread {
binding.historyRecyclerView.isVisible = true
historyAdapter.submitList(keywords.orEmpty())
}
}.start()
'Android > Side Projects' 카테고리의 다른 글
도서 리뷰 앱 개발하기 (0) | 2022.02.14 |
---|---|
도서 리뷰 앱 개발하기 (0) | 2022.02.13 |
도서 리뷰 앱 개발하기 (0) | 2022.02.11 |
도서 리뷰 앱 개발하기 (1) | 2022.02.10 |
My Alarm 앱 개발하기 (0) | 2022.02.09 |