본문 바로가기
프로그래밍/Android

(Android) Room Persistence Library 실습 -1

by LiveData 2018. 12. 21.
반응형

전 포스터에  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 만들기

 -  DAOSQL 쿼리를 지정하고 메소드 호출을 연결합니다. 쿼리는 별도의 스레드에서 동작하며 메인스레드에서 동작하지 않습니다.

data 패키지 아래에 source 패키지를 생성하고 그 아래 local 패키지를 생성한 후 WordDao.class를 생성합니다.
중요한 점은 Interface class라는 것입니다.(abstract class도 가능)

Dao는 interface 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();
}

위와 같이 annotation 으로 쿼리를 작성 후 동작할 함수를 선언합니다.

@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에 대해 알아보려면 아래의 링크를 클릭해주세요.


반응형