Room 지속성 라이브러리는 Sql Lite의 진화판이다.
SqlLite를 쓰면서 버전 업데이트에 관한 문제라던지,
사용함의 불편함을 해소해주는 장점을 갖고있다.
다른점? |
---|
컴파일할때 유효성 검사 |
스키마가 바뀌었을때 SQL쿼리를 수정 X |
자바객체에 매핑한다 |
//테이블 이름
@Entity(tableName = "room_memo")
class RoomMemo {
// no에 값이 없을 때 자동증가된 숫자값을 db에 입력해준다.
@PrimaryKey(autoGenerate = true)
@ColumnInfo
var no: Long? = null
@ColumnInfo
var content: String = ""
@ColumnInfo(name = "date")
var datetime: Long = 0
//생성자 만들시, 빠르게 생성가능하다.
constructor(content: String, datetime:Long){
this.content = content
this.datetime = datetime
}
VoClass를 작성해보았다.
@Dao
interface RoomMemoDAO {
@Query("select * from room_memo")
fun getAll() : List<RoomMemo>
//키가 겹칠경우, update로 변환해주는 어노테이션이다.
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insert(memo:RoomMemo)
@Delete
fun delete(memo:RoomMemo)
}
//어떤 VO를 이용할건지, 버전은 무엇인지, 폴더에 스키마를 따로 만들건지의 내용이다.
@Database(entities = arrayOf(RoomMemo::class), version = 1 , exportSchema = false)
abstract class RoomHelper : RoomDatabase() {
abstract fun roomMemoDao() : RoomMemoDAO
}
//helper를 이용해 사용할수있게 만들기
helper = Room.databaseBuilder(this, RoomHelper::class.java, "room_db")
.allowMainThreadQueries()
.build()
//helper.roomMemDao를 이용해 Dao객체를 만들어낸다.
memoDAO = helper.roomMemoDao()
fun insertMemo(memo: RoomMemo) {
CoroutineScope(Dispatchers.IO).launch {
//insert를 이용해 넣을수 있다.
memoDAO.insert(memo)
refreshAdapter()
}
}
fun refreshAdapter() {
CoroutineScope(Dispatchers.IO).launch {
memoList.clear()
memoList.addAll(memoDAO.getAll())
withContext(Dispatchers.Main) {
memoAdapter.notifyDataSetChanged()
}
}
}