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 setContentViewsetelah 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
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
}
}
}