GDSC HUFS 3기/Android with Kotlin Team 6

[6팀] 코틀린 안드로이드 기초강의 41 Room

qkrgusqls 2021. 11. 26. 11:43

이 글은 이것이 안드로이드다 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를 활용하면 코드를 간결하게 할 수 있습니다.

room을 활용한 메모&nbsp;