Update data ke tabel database dalam Android Kotlin

 

1. Menambahkan kode SQL

Bukalah file UserDao.kt lalu masukkan kode berikut ini:

@Update
suspend fun updateUser(user:User)

 

2. Membuat Fragment Form Edit

2.1 Membuat Class Fragment

Buatlah sebuah blank fragment dengan nama EditFragment dengan file xml bernama fragment_edit.xml

 

2.1.1 Perubahan pada file fragment_edit.xml

Copy semua kode dari file activity_main.xml ke dalam file fragment_edit.xml dan letakkan didalam tag FrameLayout

 

2.1.2 Perubahan ARG_PARAM1

Rubahlah isi dari variabel read-only ARGA_PARAM1 menjadi seperti berikut ini:

private const val ARG_PARAM1 = "idMurid"

 

2.1.3 Perubahan pada metode onCreate

Masukanlah kode berikut ini:

vm = ViewModelProvider(this).get(viewModelTampilData::class.java)

Keterangan: 

  • Kode diatas digunakan untuk memanggil ViewModelTampilData

 

2.1.4 Pembuatan metode onViewCreated

Buatlah metode onViewCreated seperti berikut ini:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
}

Keterangan:

  • Metode onViewCreated adalah metode dimana View sudah dibuat

 

2.1.4.1 Deklarasi Komponen Form

Masukkan kode berikut ini ke dalam metode onViewCreated:

val edtNama: EditText = view.findViewById<EditText>(R.id.edtNama);
val edtTglLahir: EditText = view.findViewById<EditText>(R.id.edtTglLahir);
val rbLaki : RadioButton = view.findViewById<RadioButton>(R.id.rbLaki);
val rbCewek : RadioButton = view.findViewById<RadioButton>(R.id.rbCewek);
val rgJkel = view.findViewById<RadioGroup>(R.id.rgJkel);
val spAgama : Spinner = view.findViewById(R.id.spAgama)
val chkHobby1 : CheckBox = view.findViewById<CheckBox>(R.id.chkHobby1)
val chkHobby2 : CheckBox = view.findViewById<CheckBox>(R.id.chkHobby2)
val chkHobby3 : CheckBox = view.findViewById<CheckBox>(R.id.chkHobby3)
val agama = resources.getStringArray(R.array.agama)
val adapter = ArrayAdapter(
    requireContext(),
    android.R.layout.simple_spinner_item, agama
)
spAgama.adapter = adapter
var agamaTerpilih = ""
spAgama.onItemSelectedListener = object : AdapterView.OnItemSelectedListener{
    override fun onItemSelected(
        parent: AdapterView<*>?,
        view: View?,
        position: Int,
        id: Long
    ) {
       
        agamaTerpilih = agama[position]
        Toast.makeText(requireContext(), "Agama yg dipilih : $agamaTerpilih", Toast.LENGTH_LONG).show()
    }

    override fun onNothingSelected(parent: AdapterView<*>?) {
        TODO("Not yet implemented")
    }
}

val tombolSimpan = view.findViewById<Button>(R.id.btSimpan);

Keterangan:

  • val edtNama: EditText = view.findViewById<EditText>(R.id.edtNama), kode ini digunakan untuk membuat variabel edtNama yang mewakili elemen view EditText dalam file xml dengan id edtNama
  • resources.getStringArray(R.array.agama) kode ini berarti saya mengambil data file xml yang terletak dalam folder res/values yang berisi tag <resources> dan didalamnya terdapat tag string-array yang mempunyai name ‘agama’
  • ArrayAdapter( requireContext(), android.R.layout.simple_spinner_item, agama ), kode ini digunakan untuk membuat sebuah adapter dari array agama, adapter ini digunakan sebagai data bagi objek View Spinner

 

2.1.4.2 Tampilkan data ke Form

Tambahkan kode berikut ini ke metode onViewCreated:

lifecycleScope.launch {
  val dataUser =  vm.userDao.ambilSatu(param1!!.toInt())


    edtNama.setText(dataUser?.nama)
    edtTglLahir.setText(dataUser?.tgl_lahir)

    if(dataUser?.jenis_kelamin=="Laki-laki"){
        rbLaki.isChecked = true
    }else{
        rbCewek.isChecked = true
    }


    for (i in agama.indices) {
        if(agama[i] == dataUser?.agama){
            spAgama.setSelection(i)
        }
    }


    val arrData :Array<String> = dataUser?.hobi!!.split(",").toTypedArray()

    for(elemen in arrData){
        if(elemen.trim() == "Sepakbola")
            chkHobby1.isChecked = true

        if(elemen.trim() == "Main Game Online")
            chkHobby2.isChecked = true

        if(elemen.trim() == "Basket")
        chkHobby3.isChecked = true


    }
}

Keterangan:

  • lifecycleScope.launch digunakan untuk menjalankan koroutin dalam fragment
  • vm.userDao.ambilSatu(param1!!.toInt()) -> kode ini digunakan untuk mengambil satu record dari tabel database
  • dataUser?.hobi!!.split(“,”).toTypedArray() -> kode ini digunakan untuk memecah string yang dipisahkan dengan koma menjadi array

2.1.4.3 Update data ke Tabel Database

Tambahkan kode berikut ini ke dalam metode onViewCreated:

tombolSimpan.setOnClickListener {
    val nama:String = edtNama.text.toString();
    val tglLahir = edtTglLahir.text.toString();
    val idRbTerpilih = rgJkel.checkedRadioButtonId;

    val rbJkel = view.findViewById<RadioButton>(idRbTerpilih);
    val jKel = rbJkel.text
    var hobi = ""
    if(chkHobby1.isChecked)
        hobi+= chkHobby1.text.toString()

    if(chkHobby2.isChecked) {

        if(hobi.length==0)
            hobi += chkHobby2.text.toString()
        else
            hobi += ", "+ chkHobby2.text.toString()

    }
    if(chkHobby3.isChecked){

        if(hobi.length==0)
            hobi += chkHobby3.text.toString()
        else
            hobi+=", "+chkHobby3.text.toString()

    }



    val tblUser = User(
        id = param1!!.toInt(),
        nama = nama,
        tgl_lahir = tglLahir,
        jenis_kelamin = jKel.toString(),
        agama = agamaTerpilih,
        hobi = hobi

    )
    lifecycleScope.launch(Dispatchers.IO) {
          vm.userDao.updateUser(tblUser)

    }
    Toast.makeText(requireContext(), " Halo $nama, \n kamu lahir tanggal : $tglLahir, \n jenis kelaminmu : $jKel, \n Hobimu : $hobi", Toast.LENGTH_LONG).show();

}

Keterangan:

  • param1!!.toInt() -> tanda seru 2x disini memastikan bahwa variabel param1 ini tidak null
  • Dispatchers.IO digunakan untuk memastikan bahwa waktu pengaksesan database tidak akan membuat tampilan hang
  • vm.userDao.updateUser(tblUser) -> kode ini digunakan untuk mengupdate record user

 

3. Menampilkan Tombol Edit

3.1 Pembuatan metode bikinTombolEdit

Bukalah file SecondFragment.kt lalu buatlah metode bikinTombolEdit seperti berikut ini:

fun bikinTombolEdit(teks:String, id: Int, indeks: Int){
    val tombol = Button(activity).apply {
        text = "Edit "+teks
        layoutParams =  FrameLayout.LayoutParams(
            FrameLayout.LayoutParams.WRAP_CONTENT,
            FrameLayout.LayoutParams.WRAP_CONTENT
        )

    }
    val params = tombol.layoutParams as ViewGroup.MarginLayoutParams
    if(indeks==0)
        params.marginStart =5
    else
        params.marginStart +=200
    
    params.topMargin = 150

    tombol.layoutParams = params

    wadah.addView(tombol)


    tombol.setOnClickListener {
        val paket = Bundle()
        paket.putString("idMurid","$id")
        val fragmentEdit = EditFragment()
        fragmentEdit.arguments=paket
      
        parentFragmentManager.commit {
            setReorderingAllowed(true)
            replace(R.id.isiFragment,fragmentEdit )
        }

    }

}

Keterangan:

  • ViewGroup.MarginLayoutParams digunakan untuk mengatur jarak luar dari elemen
  • paket.putString(“idMurid”,”$id”) -> kode ini berarti saya mengisi objek Bundle dengan data idMurid
  • setReorderingAllowed(true) digunakan agar transisi ke tumpukan sebelumnya lancar

 

3.2 Pemanggilan metode bikinTombolEdit

Dalam metode onViewCreated maka panggillah metode bikinTombolEdit seperti berikut ini:

bikinTombolEdit(orang.nama, orang.id, indeks)

 

4. Jalankan Aplikasi

Pilih virtual devicemu lalu tekan tombol Play