전 포스터에 Room Database가 어떤 것인지 간략하게 알아보았습니다.
혹시 안보셨으면 아래의 화면을 클릭해주세요.
이번에는 실제로 Room Database를 사용해보도록 합시다.
이번 포스트 파일의 구조 (파란색-> package)
▶ data
■ source
◆ local
● WordDao.class (Dao)
■ Word.class (Entity)
▶ MainActivity.class
Android Studio 프로젝트를 생성
Target SDK 버전은 26 이상으로 해야합니다.
프로젝트를 생성해줍니다.
gradle file 추가하기
아래와 같이 gradle을 추가해줍니다.
design : floatButton을 사용하기 위해 추가해주었습니다.
room : RoomDatabase를 사용하기 위해 추가해줍니다.
lifecycle : livedata를 사용하기 위해 추가해 줍니다.
//appcompat의 버전에 맞게 해주셔야합니다.(현재 전 27.1.1 사용 중)
implementation 'com.android.support:design:27.1.1'
// Room components
implementation "android.arch.persistence.room:runtime:1.0.0"
annotationProcessor "android.arch.persistence.room:compiler:1.0.0"
androidTestImplementation "android.arch.persistence.room:testing:1.0.0"
// Lifecycle components
implementation "android.arch.lifecycle:extensions:1.1.0"
annotationProcessor "android.arch.lifecycle:compiler:1.1.0"
|
cs |
Entity 만들기
- Entity는 object이자 데이터베이스의 테이블을 나타냅니다.
new -> Package로 data를 생성해주고
data 패키지 아래에 Word.class를 생성합니다.
그 후 아래와 같이 Word의 코드를 작성합니다.
@Entity(tableName="word_table")
public class Word {
@PrimaryKey
@NonNull
@ColumnInfo(name = "word")
private String mWord;
public Word(@NonNull String word) {this.mWord=word;}
public String getWord() {return this.mWord;}
}
|
Entity 파일의 특징은 class의 변수들이 colum이 되어 데이터베이스의 table로 된다는 것입니다.
ColumnInfo로 필드의 이름을 설정하지 않는다면 필드이름과 같은 colum이름으로 생성됩니다.
이때, 실제 table로 만들고 싶지 않는 필드가 있다면 @Ignore을 위에 선언합니다.
Annotation 속성
@Entity(tableName="word_table")
: Entity의 테이블 명을 선언합니다.
@PrimaryKey
: 모든 Entity는 PrimaryKey가 필요합니다. (값을 구별하기 위한 식별자)
@ColumnInfo(name="word")
: 테이블에서 "word"라는 이름으로 데이터베이스 colum 사용
(필수! Enitity에는 getter 함수가 필수적으로 존재해야하고 변수들은 public형태여야합니다.)
cf. @Embedded
: 필드로 object를 갖는 경우 사용한다.
다른 Annotations의 속성을 보려면 아래의 링크를 클릭해주세요.
DAO 만들기
- DAO는 SQL 쿼리를 지정하고 메소드 호출을 연결합니다. 쿼리는 별도의 스레드에서 동작하며 메인스레드에서 동작하지 않습니다.
data 패키지 아래에 source 패키지를 생성하고 그 아래 local 패키지를 생성한 후 WordDao.class를 생성합니다.
중요한 점은 Interface class라는 것입니다.(abstract class도 가능)
생성 후 아래과 같이 코드를 작성합니다.
@Dao
public interface WordDao {
@Insert
void insert(Word word);
@Query("DELETE FROM word_table")
void deleteAll();
@Query("SELECT * from word_table ORDER BY word ASC")
LiveData<List<Word>> getAllWords();
}
|
@Insert
: word로 들어가는 object 데이터를 데이터베이스에 추가합니다.
@Query("DELETE FROM word_table")
: word_table을 삭제합니다.
@Query("SELECT * from word_table ORDER BY word ASC")
: word_table의 모든 데이터를 word colum의 오름차순으로 가져옵니다.
근데 맨 아래 코드에 LiveData는 무엇이지??
여기서 잠깐 LiveData에 대해 알아보고 갑시다.
LiveData
만약 데이터가 변경되면 일반적으로 업데이트 된 데이터를 UI에 표시하는 작업을 수행하려고 합니다.
즉, 데이터가 변경 될 때 즉시 업데이트할 수 있는 것이 필요하죠.
하지만, 데이터의 저장방법에 따라 까다로울 수 있고 이로 인해 테스트와 디버깅이 어려워집니다.
LiveData는 이러한 문제를 해결 할 수 있습니다.
추후 Observer을 만들고 onChanged() 함수를 정의합니다.
만약 LiveData의 데이터 변경되면 onChanged() 함수가 실행됩니다. 그러면 보여지는 화면에 update된 데이터들을 확인할 수 있습니다.
더 자세하게 LiveData에 대해 알아보려면 아래의 링크를 클릭해주세요.
'프로그래밍 > Android' 카테고리의 다른 글
(Android) Dagger2 (0) | 2018.12.21 |
---|---|
(Android) ActivityContext? ApplicationContext? (0) | 2018.12.21 |
(Android) Room Persistence Library(Room Database) (0) | 2018.12.21 |
(Android) PullRefresh - 뷰의 끌어당기는 로딩 (0) | 2018.12.21 |
(Android) ViewAnimation - UI 애니메이션 효과 적용하기 (0) | 2018.12.21 |