KOTLIN CRUD ROOM

 


TAHAP 1 SETTING GRADEL

1. buka Android studio


2. tambahkan depedencies pada gradel :

//Material desain
def material_version = "1.2.1"
implementation 'com.google.android.material:material: $material_version'

//room
def room_version = "2.4.1"
implementation "androidx.room:room-runtime:$room_version"
annotationProcessor "androidx.room:room-compiler:$room_version"

//corountines
def corountines_version = "1.3.9"
implementation "androidx.room:room-ktx:$room_version"
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android: $corountines_version")

TAHAP 2 SETTING PROJECT TAHAP AWAL
pada setting tahap awal seperti setting sebuah koneksi database namun dikotlin lebih kompleks dibanding di php
buat folder baru bernama room satu folder dengan mainactivity :
- room (folder)
- mainActivity (class)
didalam folder room buat 3 file class kotlin
- Note (merupakan sebuah entity)
- NoteDao (merupakan representasi dari Interface DAO yang berisi Insert, update, delete, read)
- NoteDB (merupakan sebuah class abstract atau intance yang mempresentasikan Note(entity) dan NoteDao (interface)

isi dari class Note (Entity)
package com.agus.appmessaging.room

import androidx.room.Entity
import androidx.room.PrimaryKey

//ini adalah class entity dev-1 dibuat pertama kali

@Entity
data class Note (
@PrimaryKey(autoGenerate = true)
val id: Int,
val title: String,
val note: String
)

isi dari class interface DAO
package com.agus.appmessaging.room

import androidx.room.*
//ini adalah class DAO Interface dev-2 dibuat setelah class entity
@Dao
interface NoteDao {

@Insert
fun addNote(note : Note)

@Update
fun updateNote(note : Note)

@Delete
fun deleteNote(note : Note)

@Query("SELECT * FROM note")
fun getNotes(note : Note):List<Note>
}
Isi dari class abstract/Intance:
package com.agus.appmessaging.room

import android.content.Context
import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase

@Database(
/*scrip apabila entity note nya lebih dari 1 entity
* entities = [Note::class, Book::class], ini di ambil dari Entity
* */
entities = [Note::class],
version = 1
)
/*ini merupakan class Abstrack atau di sebut juga Instance */
abstract class NoteDB : RoomDatabase(){

/*abstract berikut diambil dari kelas DAO Interface dari yang dibuat kedua
* jika lebih dari satu dao tinggal ditambahkan saja interface dao nya apa
* ex:
* abstract fun noteDao() : NoteDao
* abstract fun BookDao() : BookDao
* */
abstract fun noteDao() : NoteDao

companion object {

@Volatile private var instance : NoteDB? = null
private val LOCK = Any()

operator fun invoke(context: Context) = instance ?: synchronized(LOCK){
instance ?: buildDatabase(context).also {
instance = it
}
}

private fun buildDatabase(context: Context) = Room.databaseBuilder(
context.applicationContext,
NoteDB::class.java,
/*berikut ini merupakan database
* untuk nama buat seunik mungkin yg mempresentasikan obyek
* .db bukan extensi tapi agar unik aja
* */
"note12345.db"
).build()

}
}

TAHAP KE 3 MEMBUAT DESAIN
1. Desain pada activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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=".MainActivity">

<androidx.recyclerview.widget.RecyclerView
android:id="@+id/list_note"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toTopOf="@+id/button_create"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"

/>

<Button
android:id="@+id/button_create"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="Tulis Catatan"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_margin="10dp"
/>
</androidx.constraintlayout.widget.ConstraintLayout>

2. Desain Pada Activiti_edit.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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=".EditActivity"
android:padding="20dp">
<EditText
android:id="@+id/edit_title"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:hint="Judul"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
/>
<EditText
android:id="@+id/edit_note"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:hint="Tulis Catatan"
android:minLines="3"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@+id/edit_title"
android:layout_marginTop="10dp"
android:gravity="top"
/>
<Button
android:id="@+id/button_save"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="SAVE"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@+id/edit_note"
android:layout_marginTop="20dp"
/>
<Button
android:visibility="gone"
android:id="@+id/gone"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="UPDATE"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@+id/button_save"
android:layout_marginTop="20dp"
/>
</androidx.constraintlayout.widget.ConstraintLayout>

tahap selanjutnya kita masuk pada editActivity dan kemudian kita buat function setUpListener()
dibawah setContentView

setelah itu kita buat functionnya seperti berikut:

fun setUpListener(){

button_save.setOnClickListener {
/*untuk DAO(data access obyek pada sebuah DAO ygn sudah kita buat kita menggunakan
* coroutines*/
CoroutineScope(Dispatchers.IO).launch {
//panggil db nya
db.noteDao().addNote(
Note(0, edit_title.text.toString(), edit_note.text.toString())
)
//tambahkan finish agar balik ke activity sebelumnya
finish()

}
}

sebelum buat function jangan lupa buat deklarasi db seperti : 
 val db by lazy { NoteDB(this)}

 diatas function oncreate, contoh seperti berikut

class EditActivity : AppCompatActivity() {
//buat db terlebih dahulu ambil NoteDB dari abstract/intance
val db by lazy { NoteDB(this)}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_edit)
setUpListener()

}
setelah itu kita buat ujicoba terlebih dahulu menampilkan data ke LOGCat atau Console
Caranya buat function untuk menampilkan data pada mainActivity seperti berikut :
override fun onStart() {
super.onStart()
CoroutineScope(Dispatchers.IO).launch {
val notes =db.noteDao().getNotes()
Log.d("MainActivity", "dbResponse: $notes")
withContext(Dispatchers.Main){
noteAdapter.setData(notes)
}
}
}
jangan  lupa tambahkan deklarasi Database :  val db by lazy { NoteDB(this)}
diatas function onCreate
setelah itu running aplikasi dan jalankan maka hasilnya seperti berikut :



TAHAP 4 MENAMPILKAN DATA

Pada tahap ini kita akan mencoba menampilkan data :
langkah pertama membuat desain layout adapter_activity.xml seperti berikut
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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="wrap_content"
tools:context=".Adapter"
android:padding="10dp">
<TextView
android:id="@+id/text_title"
android:layout_width="0dp"
android:layout_height="wrap_content"
tools:text="Nanti kita cerita hari ini"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toStartOf="@+id/icon_edit"
/>
<ImageView
android:id="@+id/icon_edit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_edit"
android:padding="10dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toStartOf="@+id/icon_delete"
/>
<ImageView
android:id="@+id/icon_delete"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_delete"
android:padding="10dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toEndOf="parent"
/>
</androidx.constraintlayout.widget.ConstraintLayout>

Buat file kelas kotlin class NoteAdapter.kt sejajar dengan kelas mainActifity.kt seperti berikut :
package com.agus.appmessaging

import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.agus.appmessaging.room.Note
import kotlinx.android.synthetic.main.activity_adapter.view.*

//mengambil araylist dari room note kemudian extend pada recyclerview
class NoteAdapter(private val notes: ArrayList<Note>):RecyclerView.Adapter<NoteAdapter.NoteViewHolder>() {


override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): NoteViewHolder {
return NoteViewHolder(
LayoutInflater.from(parent.context).inflate(R.layout.activity_adapter, parent,false)
)
}

override fun onBindViewHolder(holder: NoteViewHolder, position: Int) {
val note =notes[position]
//menampilkan datanya disini
holder.view.text_title.text = note.title
}

override fun getItemCount()= notes.size
//untuk mengambil view dari layout
class NoteViewHolder( val view: View):RecyclerView.ViewHolder(view)

fun setData(list: List<Note>){
notes.clear()
notes.addAll(list)
notifyDataSetChanged()
}
}

Setelah itu buat function setUpCyrcleView() pada main aktifity dan isi nya sebagai berikut keseluruhan:
package com.agus.appmessaging

import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import androidx.recyclerview.widget.LinearLayoutManager
import com.agus.appmessaging.room.Note
import com.agus.appmessaging.room.NoteDB
import kotlinx.android.synthetic.main.activity_edit.*
import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import kotlin.math.log

class MainActivity : AppCompatActivity() {

val db by lazy { NoteDB(this) }
lateinit var noteAdapter:NoteAdapter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
setUpLinsterner()
setUpRecyclerView()
}

override fun onStart() {
super.onStart()
CoroutineScope(Dispatchers.IO).launch {
val notes =db.noteDao().getNotes()
Log.d("MainActivity", "dbResponse: $notes")
withContext(Dispatchers.Main){
noteAdapter.setData(notes)
}
}
}


fun setUpLinsterner(){
button_create.setOnClickListener{
//untuk pindah ke actifity edit
startActivity(Intent(this, EditActivity::class.java))
}
}

private fun setUpRecyclerView(){
noteAdapter = NoteAdapter(arrayListOf())
list_note.apply {
layoutManager = LinearLayoutManager(applicationContext)
adapter = noteAdapter
//selanjutnya tambahkan di bagian corountines
}
}
}

Read More

Comments

3-comments

FOLLOW ME

LATEST

3-latest-65px

Featured Post

© . All rights reserved.

Archive

Latest video-course

1-tag:Videos-800px-video

Campus

4-tag:Campus-500px-mosaic

About

This just a demo text widget, you can use it to create an about text, for example.

Testimonials

3-tag:Testimonials-250px-testimonial

Header Background

Header Background
Header Background Image. Ideal width 1600px with.

Popular Posts

Logo

Logo
Logo Image. Ideal width 300px.

Section Background

Section Background
Background image. Ideal width 1600px with.

Section Background

Section Background
Background image. Ideal width 1600px with.

Sections-BTLabels

Ads block

Banner 728x90px

Courses

6-latest-350px-course

Section Background

Section Background

Search This Blog

Widget HTML Atas

SECCIONS

Widget HTML Produk

Widget HTML Jasa

Advertisement

Main Ad

Categories

10 permasalahan 59 62 63 64 79 Tahun 2014 administrator adobeprimer aktivasi windows 10 android studio aplikasi aplikasi idm aplikasi klinik aplikasi raport K13 ar augmented reality aulogisbootspeed banner basic belajar Belajar Logika Informatika Bingkai PSHT Bingkai bingkai Sertifikat blender blog penjualan blogger jualan bobol wifi C++ Canon IP2770 cara bobol wifi cara buat blog cara buatweb cara install cms cara install wordpress cara membuat blog penjualan cara mengguanakan vpn cek pc cek produk key pc cek serial number pc CI ci4 class cms cms wordpress codeigniter contoh mehtod crack crud CI4 dapodik dapodik terjadi kesalahan dasar data daun sirih desaign desain medali desain sertifkat devc dowload software download download vpn erorr 500 file firewall formulir formulir penilaian p[ertandingan pencak silat formulir pertandingan free freebish function gratis hack wifi hacker wifi hacking handler herbal hms hms kit http 500 huwawei idm idm terbaru instalasi install worpress internet download manager ioncubeloader ip address jam jaringan javascript json kesahatan kodeigniter kodinglangka komputer komputer lemot kotlin Kumpuran Permendikbud No. 61 logo make address manampilkan gambar di wa manfaat daun sirih mars psht marspsht masalah pc medali membuat blog jualan membuat web membuat website mencegah seraangan hacjer mengatasi dapodik bermasalah mengatasi masalah ci mengatasi masalah pc menggunakan vpn menghitung selisih waktu mikrotik motivasi mysql mysql tidak runnig di xampp Native network networking node nodejs obat herbal obyek oop pekerjaan peluang pencak silat pendidikan pengertian cms penjualan pergaulan Permasalahan Komputer pertandingan pesilat.png Photoshop php php native php oop piagam png print printer Printer IP2770 property psht PSHT Cup Bandar Lampung psht jaya raport K13 raport SD K13 Rekam medis rekammedis selisih jam php seo sertifikat sertifikat psht sh cup sharing sharing printer sharingdata sharingfile sirih hijau sirih merah software software bandicam software terbaru software vidio sofware idm source code source code raport K13 sourcecode SQL system telnet turbo vpn tutorial tutorial dasar web tutorial oop tutorial php tutorial sql tutorial web tutorialjaringan ukuran idcard unity update bagan video vpn vuvoria web web dasar web simple website widows10 wifi hack wifi telnet windows windows defender windows8 wordpress worpress xampp

SEARCH

FOLLOW US

Popular

SEARCH