상세 컨텐츠

본문 제목

[안드로이드 코틀린] Database Room 사용법 part4 - 수정

안드로이드

by aries574 2022. 6. 27. 14:13

본문


이번 시간에는  리스트보인 사용자를 선택하면 수정 화면(UpdateActivity)으로 이동하고,

정보를 변경하고 저장하면 DB내용이 업데이트, 메인화면(MainActivity)으로 이동하는 방법에

대하여 알아보겠습니다.

이전 포스팅은 아래 링크를 들어가시면 됩니다.

2022.06.26 - [안드로이드] - [안드로이드 코틀린] Database Room 사용법 part3 - 리스트

 

[안드로이드 코틀린] Database Room 사용법 part3 - 리스트

이번 시간에는 등록한 사용자를 RecyclerView를 이용해서 리스트로 보여주는 방법에 대하여 알아보겠습니다. 이전 포스팅은 아래 링크를 들어가시면 됩니다. 2022.06.25 - [안드로이드] - [안드로이드

aries574.tistory.com


목차

1. 실행 화면
2. 액티비티 설정
3. 수정 화면 만들기 UpdateActivity
4. 아이템 어댑터 수정 UserAdapter.kt
5. 메인 코드 수정 MainActivity.kt


1. 실행 화면


2. 액티비티 설정

 - 설명 - 

 액티비티 중복 생성 방지

MainActivity에 추가

android:launchMode="singleTask"

 <activity
     android:name=".MainActivity"
     android:exported="true"
     android:launchMode="singleTask">


3. 수정 화면 만들기 UpdateActivity

app 선택 -> 마우스 오른쪽 클릭 -> New -> Activity -> Empty Activity

 액티비티 이름: UpdateActivity

 - 설명 -

 1. 리스트에서 선택한 데이터 보여주는 EditText

 2. 수정한 사용자 정보를  저장하는 Button

activity_update.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".UpdateActivity">

    <EditText
        android:id="@+id/up_name_edit"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="이름"
        android:inputType="text"/>
    <EditText
        android:id="@+id/up_age_edit"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/up_name_edit"
        android:hint="나이"
        android:inputType="number"/>

    <Button
        android:id="@+id/update_btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/up_age_edit"
        android:layout_centerHorizontal="true"
        android:text="수정"/>
</RelativeLayout>

 

 - 설명 -

 1. var name: String? = intent.getStringExtra("uName")

ItemAdapter에서 넘어온 데이터 변수에 담기

 2. upNameEdit.setText(name)

사용자 정보 화면에 보여주기

3. upNameEdit.text.toString()

 입력 변수에 담기

4. var user: User = User(uId, iName, iAge)

수정할 데이터 생성자에 담기

5. db?.userDao()?.updateUser(user)

수정 DB 호출

UpdateActivity.kt

class UpdateActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_update)

        //초기화
        var upNameEdit: EditText = findViewById(R.id.up_name_edit)
        var upAgeEdit: EditText = findViewById(R.id.up_age_edit)
        var updateBtn: Button = findViewById(R.id.update_btn)

        //UserAdapter에서 넘어온 데이터 변수에 담기
        var uId: Int = intent.getIntExtra("uId", 0)
        var uName: String? = intent.getStringExtra("uName")
        var uAge: String? = intent.getStringExtra("uAge")

        //화면에 값 적용
        upNameEdit.setText(uName)
        upAgeEdit.setText(uAge)

        //수정버튼 이벤트
        updateBtn.setOnClickListener {
            //입력값 변수에 담기
            var iName = upNameEdit.text.toString()
            var iAge = upAgeEdit.text.toString()

            //사용자 클래스 생성
            var user: User = User(uId, iName, iAge)

            //DB생성
            var db: AppDatabase? = AppDatabase.getDatabase(applicationContext)

            //데이터 수정
            db?.userDao()?.updateUser(user)

            //메인화면으로 이동
            var intent: Intent = Intent(applicationContext, MainActivity::class.java)
            startActivity(intent)

            //액티비티 종료
            finish()
        }
    }
}

 


4. 아이템 어댑터 수정 UserAdapter.kt

 

- 설명 -

1. private val context: Context

파라미터 추가, 액티비티 호출 시에 필요함

2. Intent(context, UpdateActivity::class.java)

Intent 생성

3. intent.putExtra("uName", name)

Intent에 데이터 담기(키값, 데이터)

4. context.startActivity(intent)

액티비티 이동

class UserAdapter(private val context: Context):
    RecyclerView.Adapter<UserAdapter.MyViewHolder>() {

    //초기화
    private  var userList: List<User> = ArrayList<User>()

    class MyViewHolder(itemView: View): RecyclerView.ViewHolder(itemView){

        val nameText: TextView = itemView.findViewById(R.id.name_text)
        val ageText: TextView = itemView.findViewById(R.id.age_text)
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {

        val view: View = LayoutInflater.from(parent.context)
            .inflate(R.layout.list_item, parent, false)

        return MyViewHolder(view)
    }

    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {

        //데이터 변수에 담기
        var uId = userList[holder.adapterPosition].id
        var uName = userList[holder.adapterPosition].userName
        var uAge = userList[holder.adapterPosition].userAge

        //데이터 적용
        holder.nameText.text = uName
        holder.ageText.text = uAge

        //수정화면으로 이동
        holder.itemView.setOnClickListener {

            var intent: Intent = Intent(context, UpdateActivity::class.java)
            //값 담기
            intent.putExtra("uId", uId)
            intent.putExtra("uName", uName)
            intent.putExtra("uAge", uAge)
            context.startActivity(intent)
        }
    }

    override fun getItemCount(): Int {
        return userList.size
    }

    fun setUserList(userList: List<User>){

        this.userList = userList
        //데이터 재설정
        notifyDataSetChanged()
    }
}


5. 메인 코드 수정 MainActivity.kt

 - 설명 - 

1.  adapter = UserAdapter(this)

UserAdapter 생성자에 Context 추가했기 때문에

MainActivity에서 전달할 인자 추가

2. override fun onNewIntent(intent: Intent?)

수정 화면에서 메인화면 호출 시 실행

액티비티 중복 생성 방지하는 코드를

추가했기 때문에 OnCreate대신 실행된다. 

class MainActivity : AppCompatActivity() {

    private lateinit var adapter: UserAdapter

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val insertBtn: FloatingActionButton = findViewById(R.id.insert_btn)
        insertBtn.setOnClickListener {
            val intent: Intent = Intent(this, InsertActivity::class.java)

            activityResult.launch(intent)
        }

        //RecyclerView 설정
        val recyclerView: RecyclerView = findViewById(R.id.recyclerView)
        recyclerView.layoutManager = LinearLayoutManager(this)

        //UserAdapetr 초기화
        adapter = UserAdapter(this)

        //Adapter 적용
        recyclerView.adapter = adapter

        //사용자 조회
        loadUserList()
    }

    //액티비티가 백그라운드에 있는데 호출되면 실행
    override fun onNewIntent(intent: Intent?) {
        super.onNewIntent(intent)

        //사용자 조회
        loadUserList()
    }

    private val activityResult: ActivityResultLauncher<Intent> = registerForActivityResult(
        ActivityResultContracts.StartActivityForResult()){
        if(it.resultCode == RESULT_OK){
            //돌아온 값이 OK라면

            //사용자 조회
            loadUserList()
        }
    }

    //사용자 조회
    private fun loadUserList(){

        val db: AppDatabase? = AppDatabase.getDatabase(applicationContext)

        val userList: List<User> = db?.userDao()!!.getAllUser()

        if(userList.isNotEmpty()){

            //데이터 적용
            adapter.setUserList(userList)
        }
    }
}

2022.06.17 - [안드로이드] - [안드로이드 코틀린] 정해진 시간에 알람 울리는 방법 Notification TimePickerDialog part1 - 설정

 

[안드로이드 코틀린] 정해진 시간에 알람 울리는 방법 Notification TimePickerDialog part1 - 설정

사용자가 정한 시간에 알람이 울리게 하는 방법에 대하여 알아보겠습니다. 이번 시간에는 알람 관련 클래스와 설정들을 만들어 보겠습니다. 목차 1. 알람 클래스 만들기 NotificationHelper.kt 2. 

aries574.tistory.com

2022.06.06 - [안드로이드] - [안드로이드 코틀린] 커스텀 달력 만드는 방법 part1 화면 구성

 

[안드로이드 코틀린] 커스텀 달력 만드는 방법 part1 화면 구성

이번 시간부터 코틀린 버전 커스텀 달력을 만들어보겠습니다. 이번 포스팅은 화면 구성입니다. 목차 1. 실행 화면 2. dataBinding 설정 3. 메인 화면 구성 activity_main.xml 1. 실행 화면 2. dataB..

aries574.tistory.com

2022.06.14 - [안드로이드] - [안드로이드 코틀린] Tab Custom Animation part1 - 화면 구성 및 설정

 

[안드로이드 코틀린] Tab Custom Animation part1 - 화면 구성 및 설정

앞으로 TabLayout을 직접 만들어 애니메이션 기능까지 넣어보도록 하겠습니다. 이번 시간에는 화면 구성 및 설정을 만들어 보겠습니다. 목차 1. 실행 화면 2. dataBinding 설정 build.gradle 3. 테마 변경 t

aries574.tistory.com

 

반응형

관련글 더보기

댓글 영역