Exercise 8 - RoomDB_Course
Exercise 8 - RoomDB_Course
*Lab 1:
Creating a Android application for CRUD operations on a Course (Int id, String name,
and String description), using Room database.
Solution:
To create a Kotlin Android application that performs CRUD (Create, Read, Update, Delete)
operations on a Course entity using SQLiteOpenHelper, you'll follow these steps:
1. Set up your Android project and Add Room Dependencies
2. Create the Course Entity
3. Create the DAO (Data Access Object)
1
4. Set Up the Room Database
5. Adapter and RecyclerView Setup
6. Create CRUD Operations in MainActivity
2
import androidx.room.Entity
import androidx.room.PrimaryKey
@Entity(tableName = "course_table")
data class Course(
@PrimaryKey(autoGenerate = true) val id: Int = 0,
val name: String,
val description: String
)
import androidx.room.*
@Dao
interface CourseDao {
@Insert
fun insertCourse(course: Course)
@Update
fun updateCourse(course: Course)
@Delete
fun deleteCourse(course: Course)
import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase
3
import android.content.Context
companion object {
@Volatile
private var INSTANCE: AppDatabase? = null
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
4
android:orientation="horizontal"
android:gravity="center_vertical">
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:id="@+id/textViewCourseName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textStyle="bold"
android:textSize="18sp"/>
<TextView
android:id="@+id/textViewCourseDescription"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="14sp"
android:layout_marginTop="4dp"
android:textColor="@android:color/darker_gray"/>
</LinearLayout>
<Button
android:id="@+id/buttonUpdate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Update"
android:textColor="@android:color/white" />
<Button
android:id="@+id/buttonDelete"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Delete"
android:textColor="@android:color/white"
android:layout_marginStart="8dp" />
</LinearLayout>
5
</LinearLayout>
</androidx.cardview.widget.CardView>
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
class CourseAdapter(
var courses: MutableList<Course>, // Make 'courses' accessible
private val editClickListener: (Course) -> Unit,
private val deleteClickListener: (Course) -> Unit
) : RecyclerView.Adapter<CourseAdapter.CourseViewHolder>() {
init {
// Enable stable IDs
setHasStableIds(true)
6
}
Step7: MainActivity:
- Activity_Main.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
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:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
7
<EditText
android:id="@+id/editTextCourseName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Course Name"/>
<EditText
android:id="@+id/editTextCourseDescription"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Course Description"/>
<Button
android:id="@+id/buttonAddCourse"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="Add Course"/>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerViewCourses"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"/>
</LinearLayout>
- MainActivity.kt
import android.os.Bundle
import android.widget.Button
import android.widget.EditText
import android.widget.Toast
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
8
private lateinit var recyclerViewCourses: RecyclerView
private lateinit var courseAdapter: CourseAdapter
private lateinit var database: AppDatabase
private var selectedCourse: Course? = null
private var selectedPosition: Int = -1 // Keep track of
selected position for update
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)
) { v, insets ->
val systemBars =
insets.getInsets(WindowInsetsCompat.Type.systemBars())
v.setPadding(systemBars.left, systemBars.top,
systemBars.right, systemBars.bottom)
insets
}
// Initialize views
editTextCourseName =
findViewById(R.id.editTextCourseName)
editTextCourseDescription =
findViewById(R.id.editTextCourseDescription)
buttonAddCourse = findViewById(R.id.buttonAddCourse)
recyclerViewCourses =
findViewById(R.id.recyclerViewCourses)
// Initialize database
database = AppDatabase.getDatabase(this)
// Initialize RecyclerView
recyclerViewCourses.layoutManager =
LinearLayoutManager(this)
courseAdapter = CourseAdapter(mutableListOf(), { course -
> editCourse(course) }, { course -> deleteCourse(course) })
recyclerViewCourses.adapter = courseAdapter
9
editTextCourseDescription.text.toString().trim()
if (name.isEmpty() || description.isEmpty()) {
Toast.makeText(this, "Please enter both name and
description", Toast.LENGTH_SHORT).show()
return@setOnClickListener
}
lifecycleScope.launch(Dispatchers.IO) {
if (selectedCourse == null) {
// Insert new course
val course = Course(name = name, description
= description)
database.courseDao().insertCourse(course)
} else {
// Update existing course
val updatedCourse = Course(id =
selectedCourse!!.id, name = name, description = description)
database.courseDao().updateCourse(updatedCourse)
courseAdapter.notifyItemChanged(selectedPosition)
}
}
loadCourses()
}
clearInputFields()
}
}
10
editTextCourseDescription.text.clear()
}
https://developer.android.com/codelabs/basic-android-kotlin-compose-
practice-bus-schedule-
app?hl=vi&continue=https%3A%2F%2F2.zoppoz.workers.dev%3A443%2Fhttps%2Fdeveloper.android.com%2Fcourse
11
s%2Fpathways%2Fandroid-basics-compose-unit-6-pathway-
2%3Fhl%3Dvi%23codelab-
https%3A%2F%2F2.zoppoz.workers.dev%3A443%2Fhttps%2Fdeveloper.android.com%2Fcodelabs%2Fbasic-android-
kotlin-compose-practice-bus-schedule-app#0
12