Room database는 안드로이드에 내장된 SQLite를 통한 데이터베이스 사용에 도움을 주는 AAC 라이브러리이다.
@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;
}
}
@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;
@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();
}
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();
}
}