๊นจ์•Œ ๊ฐœ๋… ๐Ÿ“‘/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 ์™„์„ฑ๋œ ์•ฑ

 

android-practice/room/InsertionResponse at master ยท Kanmanemone/android-practice

Contribute to Kanmanemone/android-practice development by creating an account on GitHub.

github.com