깨알 개념/Android

[Android] Room - 반환 값이 있는 INSERT

interfacer_han 2024. 2. 29. 13:36

#1 INSERT의 반환값

 

[Android] Room - Entity, DAO, Database

#1 이전 글 [Android] Room - 기초, INSERT와 DELETE 연습 # Room 소개 Room을 사용하여 로컬 데이터베이스에 데이터 저장 | Android Developers Room 라이브러리를 사용하여 더 쉽게 데이터를 유지하는 방법 알아보

kenel.tistory.com

Room의 DAO의 어떤 메소드들은 Long 또는 List<Long>형 return을 가질 수 있다 (위 게시글의 #5-1 참조). 아래에 있는 샘플 앱을 수정하여 @Insert 어노테이션이 붙은 메소드의 return을 Long으로 두고, 해당 return을 화면에 표시하게 만들어본다.

 

#2 수정할 샘플 앱

 

[Android] Room - 기초, INSERT와 DELETE 연습

#1 Room 소개 Room을 사용하여 로컬 데이터베이스에 데이터 저장 | Android Developers Room 라이브러리를 사용하여 더 쉽게 데이터를 유지하는 방법 알아보기 developer.android.com SQLite는 모바일 기기를 위한

kenel.tistory.com

위 게시글의 완성된 앱을 기반으로 수정을 가한다. "Save" 버튼을 누를 시, INSERT된 Entity의 기본키 id값을 Toast 메시지로 출력하게 만들어보겠다.

 

#3 코드 수정

#3-1 개요

 

[Android] ViewModel - View에 Event 발생시키기

#1 샘플 앱 [Android] ViewModel - View에 객체(ViewModel) 전달#1 개요 #1-1 Data Binding과 ViewModel [Android] Data Binding - View에 객체 전달 #1 객체 전달의 필요성 #1-1 이전 글 Data Binding - 기초 #1 데이터 바인딩 사용

kenel.tistory.com

View에 Toast 메시지를 표시하는 작업을 구현하기 위해, #3-3와 #3-4는 위 게시글에 기반하여 수정되었다.

 

#3-2 Repository (UserRepository.kt) 수정

// package com.example.insertionresponse.db

class UserRepository(private val dao: UserDAO) {

    ...

    suspend fun insert2(user: User): Long {
        return dao.insertUser2(user)
    }

    ...
}

 

#3-3 ViewModel (UserViewModel.kt) 수정

...

class UserViewModel(private val repository: UserRepository) : ViewModel() {

    ...

    private val _toastMessage = MutableLiveData<Event<String>>()
    val toastMessage: LiveData<Event<String>>
        get() = _toastMessage

    init {
        ...
    }

    // 초기화 관련
    ...

    // 버튼 클릭 시 동작
    fun saveOrUpdate() {
        if (isUpdateOrDelete) {
            // Update 작업
            TODO()
        } else {
            // Save 작업
            insert2(inputtedUser.value!!)
            clearInputBox()
        }
    }

    ...

    // Repository 동작과 관련된 메소드들
    ...

    fun insert2(user: User) = viewModelScope.launch(Dispatchers.IO) {
        val insertedId = repository.insert2(user)
        withContext(Dispatchers.Main) { // LiveData의 값 변경은 설계 상 Main 스레드에서만 실행되어야 함
            if (-1 < insertedId) {
                _toastMessage.value = Event("Inserted Id is $insertedId")
            } else {
                _toastMessage.value = Event("Insertion failed")
            }
        }
    }

    ...

    // 기타 UI 다듬기용 메소드들
    ...
}

 

#3-4 Activity (MainActivity.kt) 수정

...

class MainActivity : AppCompatActivity() {

    ...

    override fun onCreate(savedInstanceState: Bundle?) {
        ...
        displayToastEvent()
    }

    ...

    private fun displayToastEvent() {
        userViewModel.toastMessage.observe(this, Observer {
            it.getContentIfNotHandled()?.let { // Only proceed if the event has never been handled
                Toast.makeText(this, it, Toast.LENGTH_SHORT).show()
            }
        })
    }
}

 

#4 작동 확인

 

#5 완성된 앱

https://github.com/Kanmanemone/android-practice/tree/master/room/InsertionResponse