이 글은 이것이 안드로이드다 with 코틀린(개정판)를 참고하여 작성하였습니다.
작성자 : 박현빈
개발환경은 Windows, Android Studio입니다.
plugins {
id 'com.android.application'
id 'kotlin-android'
id 'kotlin-kapt'
}
dependencies {
def room_version = "2.3.0"
implementation "androidx.room:room-runtime:$room_version"
annotationProcessor "androidx.room:room-compiler:$room_version"
kapt("androidx.room:room-compiler:$roomVersion")
implementation("androidx.room:room-ktx:$roomVersion")
}
- room을 사용하기 위해서 build gradle 파일에 코드를 삽입해줍니다.
- 새로운 버전을 정의해주고, android 개발자 홈페이지에서 코드를 복사해줍니다.
- item_recycler.xml 파일을 추가해주고 텍스트 뷰와 리사이클러 뷰를 통해 메모 내용을 구성할 화면을 만들어줍니다.
package com.example.myapplication
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.example.myapplication.databinding.ItemRecylclerBinding
import java.text.SimpleDateFormat
class RecyclerAdapter(val memoList:List<Memo>) : RecyclerView.Adapter<RecyclerAdapter.Holder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): Holder {
val binding = ItemRecylclerBinding.inflate(
LayoutInflater.from(parent.context), parent, false)
return Holder(binding) //binding을 넘겨주는 형태로 반환
}
override fun onBindViewHolder(holder: Holder, position: Int) {
holder.setMemo(memoList.get(position))
}
override fun getItemCount() = memoList.size
class Holder(val binding : ItemRecylclerBinding) : RecyclerView.ViewHolder(binding.root) {
fun setMemo(memo : Memo) {
with(binding) {
textNo.text = "${memo.no}"
textContent.text = memo.content
val sdf = SimpleDateFormat("yyyy/MM/dd hh:mm")
textDatetime.text = sdf.format(memo.datetime)
}
}
}
}
@Entity(tableName = "room_memo")
class RoomMemo {
@PrimaryKey(autoGenerate = true) // no에 값이 없을 때 자동 증가된 숫자값을 db에 입력
@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
}
}
//생성자 활용시 코드가 짧아짐
- RoomMemo를 활용합니다.
- Entity는 데이터베이스내의 테이블을 나타냅니다.
import androidx.room.Database
import androidx.room.RoomDatabase
@Database(entities = arrayOf(RoomMemo::class), version = 1, exportSchema = false)
abstract class RoomHelper : RoomDatabase() {
abstract fun roomMemoDao() : RoomMemoDAO//추상메서드
}
- RoomHelper는 DAO 클래스를 꺼내서 사용할 수 있게 도와주는 코드입니다.
@Dao
interface RoomMemoDAO {
@Query("select *from room_memo")
fun getAll() : List<RoomMemo>
@Insert(onConflict = OnConflictStrategy.REPLACE)//키의 충돌에 의해 업데이트
fun insert(memo : RoomMemo)
@Delete
fun delete(memo:RoomMemo)
}
- RoomMemo를 조작할 수 있게 하는 코드입니다.
- DAO는 테이블에 필요한 메서드를 정리해놓은 파일이라고 할 수 있습니다.
- 테이블이 여러개라면 DAO(테이블 컨트롤러)도 여러개여야 합니다.
@Query 명령
@insert 삽입
@Delete 삭제
class MainActivity : AppCompatActivity() {
val binding by lazy { ActivityMainBinding.inflate(layoutInflater)}
lateinit var helper: RoomHelper
lateinit var memoAdapter: RecyclerAdapter
val memoList = mutableListOf<RoomMemo>()
lateinit var memoDAO : RoomMemoDAO
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
helper = Room.databaseBuilder(this, RoomHelper::class.java, "room_db")
.allowMainThreadQueries()
.build()
memoList.addAll(helper.roomMemoDao().getAll())
memoAdapter = RecyclerAdapter(memoList)
with(binding){
recyclerMemo.adapter = memoAdapter
recyclerMemo.layoutManager = LinearLayoutManager(this@MainActivity)
buttonSave.setOnClickListener{
val content = editMemo.text.toString()
if(content.isNotEmpty()) {
val datetime = System.currentTimeMillis()
val memo = RoomMemo(content, datetime)
helper.roomMemoDao().insert(memo)
//메모를 저장하는 코드
memoList.clear()
memoList.addAll(helper.roomMemoDao().getAll())
memoAdapter.notifyDataSetChanged()
}
}
}
}
fun refreshAdapter(){
memoList.clear()
memoList.addAll(helper.roomMemoDao().getAll())
memoAdapter.notifyDataSetChanged()
}
}
- RoomMemoDAO를 활용하면 코드를 간결하게 할 수 있습니다.
'GDSC HUFS 3기 > Android with Kotlin Team 6' 카테고리의 다른 글
[6팀] 코틀린 안드로이드 기초강의 41 Android와 SQLite 데이터 베이스 (0) | 2021.11.30 |
---|---|
[6팀] 코틀린 안드로이드 기초강의 35-36 탭메뉴 뷰페이저와프래그먼트, 리사이클러뷰 (2) | 2021.11.26 |
[6팀]코틀린 안드로이드 기초강의 40 SharedPreferences (0) | 2021.11.26 |
[6팀] 코틀린 안드로이드 기초 강의 33-34 커스텀 뷰, 커스텀 위젯 (0) | 2021.11.17 |
[6팀] 코틀린 안드로이드 기초강의 37 권한처리 (0) | 2021.11.08 |