경험의 기록

2021.05.19 - [안드로이드/AAC, MVVM] - [Android] Room 활용하여 데이터 읽기, 삽입, 삭제, 수정 - (1)

 

[Android] Room 활용하여 데이터 읽기, 삽입, 삭제, 수정 - (1)

2021.05.13 - [안드로이드/AAC, MVVM] - [Android] Room + LiveData + ViewModel + DataBinding 사용하여 MVVM 패턴 사용하기 [Android] Room + LiveData + ViewModel + DataBinding 사용하여 MVVM 패턴 사용하기..

hanyeop.tistory.com

에서 이어지는 글입니다.

 

 


 

3️⃣ 데이터 수정하기 (Update)

레이아웃 생성

입력할 때 사용한 레이아웃과 유사하게 레이아웃을 생성한다.

2021.05.19 - [안드로이드/기본] - [Android] 액티비티 팝업으로 띄우기 (Custom Dialog, theme)

 

[Android] 액티비티 팝업으로 띄우기 (Custom Dialog, theme)

위와 같이 특정 형태의 액티비티를 팝업창으로 띄우기 위해서는 Dialog를 커스텀하거나 테마를 dialog로 바꿔야한다. 1️⃣ Custom Dialog 레이아웃 만들기 사용하고 싶은 형태의 레이아웃을 하나 만

hanyeop.tistory.com

위의 방식에서 theme 방식으로 액티비티를 팝업으로 띄울 것이다.

 

Update 메소드 추가하기

Dao

@Update
   suspend fun updateUser(user : User)

Repository

suspend fun updateUser(user : User){
        userDao.updateUser(user)
    }

ViewModel

fun updateUser(user : User){
        viewModelScope.launch(Dispatchers.IO) {
            repository.updateUser(user)
        }
    }

업데이트 메소드를 추가해준다.

 

값 넘겨주기

override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        val currentItem = userList[position]
        val currentId = currentItem.id.toString()
        val currentName = currentItem.name
        val currentAge = currentItem.age.toString()

        holder.binding.idText.text = currentId
        holder.binding.nameText.text = currentName
        holder.binding.ageText.text = currentAge

        holder.binding.itemLayout.setOnClickListener {
            val intent = Intent(it.context,UpdateActivity::class.java)
            intent.putExtra("currentId", currentId)
            intent.putExtra("currentName", currentName)
            intent.putExtra("currentAge", currentAge)
            it.context.startActivity(intent)
        }
    }

리싸이클러뷰 어댑터에서 업데이트액티비티에 리싸이클러뷰에서 클릭된 값을 넘겨준다.

 

UpdateActivity

class UpdateActivity : AppCompatActivity() {
    private lateinit var binding : ActivityUpdateBinding
    private lateinit var userViewModel : UserViewModel
    private var currentId : Int? = null
    private lateinit var currentName : String
    private var currentAge : Int? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // 타이틀 삭제
        supportRequestWindowFeature(Window.FEATURE_NO_TITLE);
        binding = DataBindingUtil.setContentView(this,R.layout.activity_update)

        // 뷰모델 연결
        userViewModel = ViewModelProvider(this, UserViewModel.Factory(application)).get(UserViewModel::class.java)

        // 데이터가 넘어왔을 때
        if(intent.hasExtra("currentId") && intent.hasExtra("currentName") && intent.hasExtra("currentAge")){
            // 현재 정보를 할당해줌
            currentId = Integer.parseInt(intent.getStringExtra("currentId"))
            currentName = intent.getStringExtra("currentName").toString()
            currentAge = Integer.parseInt(intent.getStringExtra("currentAge"))

            // 에디트뷰에 수정하기 전 값을 보여줌
            binding.nameEditView.setText(currentName)
            binding.ageEditView.setText(currentAge.toString())
        }
        else{
            Toast.makeText(this,"불러오기 실패", Toast.LENGTH_SHORT).show()
        }

        // 수정 버튼 클릭 시
        binding.updateBtn.setOnClickListener {

            val name = binding.nameEditView.text.toString()
            var age = binding.ageEditView.text.toString()

            // 입력하지 않았을 때
            if ( TextUtils.isEmpty(name) || TextUtils.isEmpty(age) ){
                Toast.makeText(this, "데이터를 입력해주세요.", Toast.LENGTH_SHORT).show()
            }

            // 입력 창이 비어 있지 않을 때
            else{
                val user = User(currentId!!,name,Integer.parseInt(age))
                userViewModel.updateUser(user)
                Toast.makeText(this, "이름 : $name , 나이 : $age 로 수정", Toast.LENGTH_SHORT).show()
                finish()
            }
        }

        // 취소 버튼 클릭 시
        binding.cancelBtn.setOnClickListener {
            finish()
        }
    }
}

메인과 동일하게 뷰모델을 연결해주고,

 

넘어온 값을 현재값으로 저장해준다.

 

수정 버튼이 클릭됐을 때, 비어있는지 확인하고

뷰모델의 update메소드에 현재 값을 넘겨준다.

아이템을 클릭하면 수정할 수 있는 창이 뜨게 되고,

 

 

수정하면 반영된 것을 리스트에서 확인할 수 있다.

 

 

 

 

4️⃣ 데이터 삭제하기 (Delete)

삭제도 쉽게 하기위해 수정 레이아웃에서 할 것이다.

레이아웃에서 삭제버튼을 만들어주고

Dao

@Delete
   suspend fun deleteUser(user : User)

repository

suspend fun deleteUser(user : User){
        userDao.deleteUser(user)
    }

ViewModel

fun deleteUser(user : User){
        viewModelScope.launch(Dispatchers.IO) {
            repository.deleteUser(user)
        }
    }

각각 작성해준후

업데이트 액티비티

// 삭제 버튼 클릭 시
        binding.deleteBtn.setOnClickListener {
            val user = User(currentId!!,currentName,currentAge!!)
            userViewModel.deleteUser(user)
            Toast.makeText(this, "이름 : $currentName , 나이 : $currentAge 삭제", Toast.LENGTH_SHORT).show()
            finish()
        }

아까 유저 정보를 받았으므로 넣어서 그대로 삭제한다.

 

 

잘 삭제 되는 것을 확인할 수 있다.

 

https://github.com/HanYeop/AndroidStudio-Practice/tree/master/RoomEx

 

HanYeop/AndroidStudio-Practice

안드로이드 학습 내용 저장소. Contribute to HanYeop/AndroidStudio-Practice development by creating an account on GitHub.

github.com

 

 

 

 

 

 

 

 

 

 

반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading