[Android] Room database 사용해보기

ptm0304·2020년 5월 7일
0

안드로이드

목록 보기
5/5

Room database란?

Room database는 안드로이드에 내장된 SQLite를 통한 데이터베이스 사용에 도움을 주는 AAC 라이브러리이다.

구성요소

  1. Database
    • RoomDatabase를 상속한다
    • @Database 어노테이션 안에 사용할 entity 클래스들을 포함시킨다
    • Singleton 패턴을 사용해야 비용을 아끼면서 데이터의 일치성을 보장할 수 있다
@Database(entities = {NewsDto.class}, version=1)
@TypeConverters({RoomTypeConverter.class}) // type converter를 사용하려면 포함
public abstract class AppDatabase extends RoomDatabase {
    public abstract NewsDao newsDao();
    private static AppDatabase mAppDatabase;

    // 싱글튼 패턴을 유지해야 데이터의 일치성을 보장할 수 있다
    public static AppDatabase getInstance(Context context) {
        if(mAppDatabase==null){
            mAppDatabase = Room.databaseBuilder(context.getApplicationContext(), AppDatabase.class,
                    "it-news-db").build();
        }
        return mAppDatabase;
    }
}
  1. Entity
    • DB의 테이블과 매칭될 클래스
    • 테이블에서 칼럼에 해당하는 정보들을 변수에 담고 있다
@Entity(tableName = "news")
public class NewsDto {
    @NonNull
    @PrimaryKey
    private String link;
    @ColumnInfo(name = "title")
    private String title;
    @ColumnInfo(name = "description")
    private String description;
    @ColumnInfo(name = "pubDate")
    private Date pubDate;
    @ColumnInfo(name = "isBookmark", defaultValue = "1")
    private boolean isBookmark;
  1. DAO (Data Acces Object)
    • 실제로 DB에 접근하는 객체
    • @Dao 어노테이션을 가진 interface
    • return 값을 LiveData로 받아옴으로써 최신데이터를 유지할 수 있다
@Dao
public interface NewsDao {
    @Insert(onConflict = OnConflictStrategy.IGNORE)
    void insert(NewsDto news);

    @Insert(onConflict = OnConflictStrategy.IGNORE)
    List<Long> insertAll(List<NewsDto> news);

    @Delete
    void delete(NewsDto news);

    @Update
    void update(NewsDto news);

    @Query("SELECT * FROM NEWS ORDER BY pubDate DESC")
    LiveData<List<NewsDto>> loadAllNews();

    @Query("SELECT COUNT(*) FROM NEWS WHERE LINK = :link")
    LiveData<Integer> getNews(String link);

    @Query("SELECT * FROM NEWS WHERE isBookmark = 1 ORDER BY pubDate DESC")
    LiveData<List<NewsDto>> loadBookmarks();
}
  1. TypeConverter
    • 위에 Entity 클래스를 보면 기본자료형이 아닌 Date 객체를 칼럼으로 가지고 있는데, 이렇게 기본자료형이 아닌 객체를 사용하기 위해선 TypeConverter를 사용해야 한다
    • 아래 예제에서는 Date.getTime()을 사용해서 Long 값으로 처리해줬다
public class RoomTypeConverter {
    @TypeConverter
    public static Date fromTimestamp(Long value) {
        return value == null ? null : new Date(value);
    }

    @TypeConverter
    public static Long dateToTimestamp(Date date) {
        return date == null ? null : date.getTime();
    }
}

0개의 댓글