Exercise 9 - Room Database - Java
Exercise 9 - Room Database - Java
Building an Android Application, using Room Database to add new and display
courses:
-Main UI:
-Display data:
1
Solution:
1.Create project
-Click File -> New -> New project -> Empty Activity -> Click Next
-Choose Project name, location, language (java), min SDK -> Click Finish
-Add new activity: ViewActivity
2.Room database
-Add Library:
+Open gradle and add library for Room database:
dependencies {
implementation 'androidx.room:room-runtime:2.2.5'
annotationProcessor 'androidx.room:room-compiler:2.2.5'
}
+Click Sync Now
-Create Entities:
+Add class Course.java:
import androidx.room.Entity;
import androidx.room.PrimaryKey;
2
public Course(String courseName, String courseDescription,
String courseDuration) {
this.courseName = courseName;
this.courseDescription = courseDescription;
this.courseDuration = courseDuration;
}
-Create DAO:
+Add interface Dao
3
import androidx.room.Delete;
import androidx.room.Insert;
import androidx.room.Query;
import androidx.room.Update;
import java.util.List;
-Create database:
+Add class: CourseDatabase.java
4
import android.content.Context;
import android.os.AsyncTask;
import androidx.annotation.NonNull;
import androidx.room.Database;
import androidx.room.Room;
import androidx.room.RoomDatabase;
import androidx.sqlite.db.SupportSQLiteDatabase;
Room.databaseBuilder(context.getApplicationContext(),
CourseDatabase.class,
"course_database")
// below line is use to add fall back
to
// destructive migration to our
database.
.fallbackToDestructiveMigration()
// below line is to add callback
// to our database.
.addCallback(roomCallback)
.allowMainThreadQueries()
// below line is to
// build our database.
.build();
5
}
// after creating an instance
// we are returning our instance
return instance;
}
-Create Repository:
+Add class: CourseRepository.java
import android.app.Application;
import java.util.List;
6
public CourseRepository(Application application) {
CourseDatabase database =
CourseDatabase.getInstance(application);
dao = database.Dao();
}
3. Main Activity
-Add colors to colors.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="purple_200">#FFBB86FC</color>
<color name="purple_500">#FF6200EE</color>
<color name="purple_700">#FF3700B3</color>
<color name="teal_200">#FF03DAC5</color>
<color name="teal_700">#FF018786</color>
<color name="black">#FF000000</color>
<color name="white">#FFFFFFFF</color>
<color name="buttonColor">#0F9D58</color>
7
<color name="textColor">#FFFFFF</color>
</resources>
-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:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
8
android:backgroundTint="@color/buttonColor"/>
<Button
android:id="@+id/btnReadCourses"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:text="Read All Courses"
android:textAllCaps="false"
android:backgroundTint="@color/buttonColor"/>
</LinearLayout>
-MainActity.java
import androidx.appcompat.app.AppCompatActivity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
CourseRepository res;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnAddCourse = findViewById(R.id.btnAddCourse);
btnReadCourses = findViewById(R.id.btnReadCourses);
9
res = new CourseRepository(getApplication());
btnAddCourse.setOnClickListener(new
View.OnClickListener() {
public void onClick(View v) {
addCourse();
}
});
btnReadCourses.setOnClickListener(new
View.OnClickListener()
{
public void onClick (View v){
//Opening ViewCourses activity via a intent
Intent i = new Intent(MainActivity.this,
ViewActivity.class);
startActivity(i);
}
});
}
4.View course
-activity_view.xml
10
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ViewActivity">
</RelativeLayout>
<androidx.cardview.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:elevation="8dp"
app:cardCornerRadius="4dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="3dp"
android:orientation="vertical">
11
<TextView
android:id="@+id/tvCourseDescription"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="3dp"
android:text="Description"
android:textColor="@color/black" />
<TextView
android:id="@+id/tvCourseDuration"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="3dp"
android:text="Duration"
android:textColor="@color/black" />
</LinearLayout>
</androidx.cardview.widget.CardView>
// constructor
public CourseRVAdapter(ArrayList<Course>
courseModalArrayList, Context context) {
12
this.courseModalArrayList = courseModalArrayList;
this.context = context;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup
parent, int viewType) {
// on below line we are inflating our layout
// file for our recycler view items.
View view =
LayoutInflater.from(parent.getContext()).inflate(R.layout.course
_item, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int
position) {
// on below line we are setting data
// to our views of recycler view item.
Course modal = courseModalArrayList.get(position);
holder.tvCourseName.setText(modal.getCourseName());
holder.tvCourseDesc.setText(modal.getCourseDescription());
holder.tvCourseDuration.setText(modal.getCourseDuration());
@Override
public int getItemCount() {
// returning the size of our array list
return courseModalArrayList.size();
}
13
private TextView tvCourseName, tvCourseDesc,
tvCourseDuration;
-ViewActivity.java
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.os.Bundle;
import java.util.ArrayList;
import java.util.List;
CourseRepository res;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_view);
// getting data
res = new CourseRepository(getApplication());
courses = new ArrayList<Course>();
List<Course> data = res.getAll();
for (int i = 0; i < data.size(); i++) {
String name = data.get(i).getCourseName();
String des = data.get(i).getCourseDescription();
14
String dur = data.get(i).getCourseDuration();
courses.add(new Course(name, des, dur));
}
15