How to Perform CRUD Operations in Room Database in Android? - GeeksforGeeks

28 Nov, 2021
Data from the app can be saved on users’ devices in different ways. We can store data in the user’s device in SQLite tables, shared preferences, and many more ways. In this article, we will take a look at saving data, reading, updating, and deleting data in Room Database on Android. We will perform CRUD operations using Room Database on Android. In this article, we will take a look at performing CRUD operations in Room Database in Android. 
We will be building a simple application in which we will be adding the different types of courses that are available on Geeks for Geeks. We will be storing all this data in Room Database and performing CRUD operations on these courses. A sample video is given below to get an idea about what we are going to do in this article. Note that we are going to implement this project using the Java language. 
Room is a persistence library that provides an abstraction layer over the SQLite database to allow a more robust database. With the help of room, we can easily create the database and perform CRUD operations very easily. 
The three main components of the room are Entity, Database, and DAO. 
Entity: Entity is a modal class that is annotated with @Entity. This class is having variables that will be our columns and the class is our table.
Database: It is an abstract class where we will be storing all our database entries which we can call Entities.
DAO: The full form of DAO is a Database access object which is an interface class with the help of it we can perform different operations in our database.
Now, let’s move towards the implementation of Room Database in Android. 
Step 1: Create a New Project
To create a new project in Android Studio please refer to How to Create/Start a New Project in Android Studio. Note that select Java as the programming language.
Step 2: Adding dependency for using Room in build.gradle files
Navigate to the app > Gradle Scripts > build.gradle file and add the below dependencies in the dependencies section. 
// add below dependency for using room.  
implementation ‘androidx.room:room-runtime:2.2.5’
annotationProcessor ‘androidx.room:room-compiler:2.2.5’
// add below dependency for using lifecycle extensions for room.  
implementation ‘androidx.lifecycle:lifecycle-extensions:2.2.0’
annotationProcessor ‘androidx.lifecycle:lifecycle-compiler:2.2.0’
After adding the above dependencies section. Now sync your project and we will move towards our XML file. 
Step 3: Working with the activity_main.xml file 
Navigate to the app > res > layout > activity_main.xml and add the below code to that file. Below is the code for the activity_main.xml file. 
XML
<?xml version="1.0" encoding="utf-8"?><RelativeLayout     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">      <!--recycler view to display our data-->    <androidx.recyclerview.widget.RecyclerView        android:id="@+id/idRVCourses"        android:layout_width="match_parent"        android:layout_height="match_parent" />      <!--fab to add new courses-->    <com.google.android.material.floatingactionbutton.FloatingActionButton        android:id="@+id/idFABAdd"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignParentEnd="true"        android:layout_alignParentBottom="true"        android:layout_marginStart="18dp"        android:layout_marginTop="18dp"        android:layout_marginEnd="18dp"        android:layout_marginBottom="18dp"        android:src="@android:drawable/ic_input_add"        app:tint="@color/white" />      </RelativeLayout>
Step 4: Creating a modal class for storing our data
Navigate to the app > java > your apps package name > Right-click on it > New > Java class and name the class as CourseModal and add the below code to it. Comments are added inside the code to understand the code in more detail. 
Java
import androidx.room.Entity;import androidx.room.PrimaryKey;  // below line is for setting table name.@Entity(tableName = "course_table")public class CourseModal {      // below line is to auto increment    // id for each course.    @PrimaryKey(autoGenerate = true)          // variable for our id.    private int id;          // below line is a variable     // for course name.    private String courseName;         // below line is use for     // course description.    private String courseDescription;          // below line is use     // for course duration.    private String courseDuration;      // below line we are creating constructor class.    // inside constructor class we are not passing     // our id because it is incrementing automatically    public CourseModal(String courseName, String courseDescription, String courseDuration) {        this.courseName = courseName;        this.courseDescription = courseDescription;        this.courseDuration = courseDuration;    }      // on below line we are creating    // getter and setter methods.    public String getCourseName() {        return courseName;    }      public void setCourseName(String courseName) {        this.courseName = courseName;    }      public String getCourseDescription() {        return courseDescription;    }      public void setCourseDescription(String courseDescription) {        this.courseDescription = courseDescription;    }      public String getCourseDuration() {        return courseDuration;    }      public void setCourseDuration(String courseDuration) {        this.courseDuration = courseDuration;    }      public int getId() {        return id;    }      public void setId(int id) {        this.id = id;    }}
Step 5: Creating a Dao interface for our database
Navigate to the app > java > your app’s package name > Right-click on it > New > Java class and name as Dao and select Interface. After creating an interface class and add the below code to it. Comments are added inside the code to understand the code in more detail.
Java
import androidx.lifecycle.LiveData;import androidx.room.Delete;import androidx.room.Insert;import androidx.room.Query;import androidx.room.Update;  import java.util.List;  // Adding annotation // to our Dao class@androidx.room.Daopublic interface Dao {      // below method is use to     // add data to database.    @Insert    void insert(CourseModal model);      // below method is use to update     // the data in our database.    @Update    void update(CourseModal model);      // below line is use to delete a     // specific course in our database.    @Delete    void delete(CourseModal model);      // on below line we are making query to    // delete all courses from our database.    @Query("DELETE FROM course_table")    void deleteAllCourses();      // below line is to read all the courses from our database.    // in this we are ordering our courses in ascending order     // with our course name.    @Query("SELECT * FROM course_table ORDER BY courseName ASC")    LiveData<List<CourseModal>> getAllCourses();}
Step 6: Creating a database class
Navigate to the app > java > your app’s package name > Right-click on it > New > Java class and name it as CourseDatabase and add the below code to it. Comments are added inside the code to understand the code in more detail.
Java
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;  // adding annotation for our database entities and db version.@Database(entities = {CourseModal.class}, version = 1)public abstract class CourseDatabase extends RoomDatabase {      // below line is to create instance    // for our database class.    private static CourseDatabase instance;      // below line is to create    // abstract variable for dao.    public abstract Dao Dao();      // on below line we are getting instance for our database.    public static synchronized CourseDatabase getInstance(Context context) {        // below line is to check if         // the instance is null or not.        if (instance == null) {            // if the instance is null we            // are creating a new instance            instance =                    // for creating a instance for our database                     // we are creating a database builder and passing                     // our database class with our database name.                    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)                            // below line is to                             // build our database.                            .build();        }        // after creating an instance         // we are returning our instance        return instance;    }      // below line is to create a callback for our room database.    private static RoomDatabase.Callback roomCallback = new RoomDatabase.Callback() {        @Override        public void onCreate(@NonNull SupportSQLiteDatabase db) {            super.onCreate(db);            // this method is called when database is created            // and below line is to populate our data.            new PopulateDbAsyncTask(instance).execute();        }    };      // we are creating an async task class to perform task in background.    private static class PopulateDbAsyncTask extends AsyncTask<Void, Void, Void> {        PopulateDbAsyncTask(CourseDatabase instance) {            Dao dao = instance.Dao();        }        @Override        protected Void doInBackground(Void... voids) {            return null;        }    }}
Step 7: Create a new java class for our Repository
Navigate to the app > java > your app’s package name > Right-click on it > New > Java class and name it as CourseRepository and add the below code to it. Comments are added inside the code to understand the code in more detail.
Java
import android.app.Application;import android.os.AsyncTask;  import androidx.lifecycle.LiveData;  import java.util.List;  public class CourseRepository {          // below line is the create a variable     // for dao and list for all courses.    private Dao dao;    private LiveData<List<CourseModal>> allCourses;      // creating a constructor for our variables    // and passing the variables to it.    public CourseRepository(Application application) {        CourseDatabase database = CourseDatabase.getInstance(application);        dao = database.Dao();        allCourses = dao.getAllCourses();    }      // creating a method to insert the data to our database.    public void insert(CourseModal model) {        new InsertCourseAsyncTask(dao).execute(model);    }      // creating a method to update data in database.    public void update(CourseModal model) {        new UpdateCourseAsyncTask(dao).execute(model);    }      // creating a method to delete the data in our database.    public void delete(CourseModal model) {        new DeleteCourseAsyncTask(dao).execute(model);    }      // below is the method to delete all the courses.    public void deleteAllCourses() {        new DeleteAllCoursesAsyncTask(dao).execute();    }      // below method is to read all the courses.    public LiveData<List<CourseModal>> getAllCourses() {        return allCourses;    }      // we are creating a async task method to insert new course.    private static class InsertCourseAsyncTask extends AsyncTask<CourseModal, Void, Void> {        private Dao dao;          private InsertCourseAsyncTask(Dao dao) {            this.dao = dao;        }          @Override        protected Void doInBackground(CourseModal... model) {            // below line is use to insert our modal in dao.            dao.insert(model[0]);            return null;        }    }      // we are creating a async task method to update our course.    private static class UpdateCourseAsyncTask extends AsyncTask<CourseModal, Void, Void> {        private Dao dao;          private UpdateCourseAsyncTask(Dao dao) {            this.dao = dao;        }          @Override        protected Void doInBackground(CourseModal... models) {            // below line is use to update            // our modal in dao.            dao.update(models[0]);            return null;        }    }      // we are creating a async task method to delete course.    private static class DeleteCourseAsyncTask extends AsyncTask<CourseModal, Void, Void> {        private Dao dao;          private DeleteCourseAsyncTask(Dao dao) {            this.dao = dao;        }          @Override        protected Void doInBackground(CourseModal... models) {            // below line is use to delete             // our course modal in dao.            dao.delete(models[0]);            return null;        }    }      // we are creating a async task method to delete all courses.    private static class DeleteAllCoursesAsyncTask extends AsyncTask<Void, Void, Void> {        private Dao dao;        private DeleteAllCoursesAsyncTask(Dao dao) {            this.dao = dao;        }        @Override        protected Void doInBackground(Void... voids) {            // on below line calling method            // to delete all courses.            dao.deleteAllCourses();            return null;        }    }}
Step 8: Creating a class for our Repository
Navigate to the app > java > your app’s package name > Right-click on it > New > Java Class and name the class as ViewModal and add the below code to it. Comments are added inside the code to understand the code in more detail.
Java
import android.app.Application;  import androidx.annotation.NonNull;import androidx.lifecycle.AndroidViewModel;import androidx.lifecycle.LiveData;  import java.util.List;  public class ViewModal extends AndroidViewModel {          // creating a new variable for course repository.    private CourseRepository repository;         // below line is to create a variable for live     // data where all the courses are present.    private LiveData<List<CourseModal>> allCourses;      // constructor for our view modal.    public ViewModal(@NonNull Application application) {        super(application);        repository = new CourseRepository(application);        allCourses = repository.getAllCourses();    }          // below method is use to insert the data to our repository.    public void insert(CourseModal model) {        repository.insert(model);    }      // below line is to update data in our repository.    public void update(CourseModal model) {        repository.update(model);    }      // below line is to delete the data in our repository.    public void delete(CourseModal model) {        repository.delete(model);    }      // below method is to delete all the courses in our list.    public void deleteAllCourses() {        repository.deleteAllCourses();    }      // below method is to get all the courses in our list.    public LiveData<List<CourseModal>> getAllCourses() {        return allCourses;    }}
Step 9: Creating a layout file for each item of RecyclerView
Navigate to the app > res > layout > Right-click on it > New > layout resource file and name it as course_rv_item and add below code to it. Comments are added in the code to get to know in more detail. 
XML
<?xml version="1.0" encoding="utf-8"?><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="8dp">      <LinearLayout        android:id="@+id/idLLCourse"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:layout_margin="5dp"        android:orientation="vertical">          <!--text view for our course name-->        <TextView            android:id="@+id/idTVCourseName"            android:layout_width="match_parent"            android:layout_height="wrap_content"            android:padding="8dp"            android:text="Course Name"            android:textColor="@color/black"            android:textSize="15sp" />          <!--text view for our course duration-->        <TextView            android:id="@+id/idTVCourseDuration"            android:layout_width="match_parent"            android:layout_height="wrap_content"            android:padding="8dp"            android:text="Course Duration"            android:textColor="@color/black"            android:textSize="15sp" />          <!--text view for our course description-->        <TextView            android:id="@+id/idTVCourseDescription"            android:layout_width="match_parent"            android:layout_height="wrap_content"            android:padding="8dp"            android:text="Course Description"            android:textColor="@color/black"            android:textSize="15sp" />    </LinearLayout>      </androidx.cardview.widget.CardView>
Step 10: Creating a RecyclerView Adapter class to set data for each item of RecyclerView
Navigate to the app > java > your app’s package name > Right-click on it > New > Java class and name it as CourseRVAdapter and add the below code to it. Comments are added inside the code to understand the code in more detail.
Java
import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.TextView;  import androidx.annotation.NonNull;import androidx.recyclerview.widget.DiffUtil;import androidx.recyclerview.widget.ListAdapter;import androidx.recyclerview.widget.RecyclerView;  public class CourseRVAdapter extends ListAdapter<CourseModal, CourseRVAdapter.ViewHolder> {          // creating a variable for on item click listener.    private OnItemClickListener listener;      // creating a constructor class for our adapter class.    CourseRVAdapter() {        super(DIFF_CALLBACK);    }      // creating a call back for item of recycler view.    private static final DiffUtil.ItemCallback<CourseModal> DIFF_CALLBACK = new DiffUtil.ItemCallback<CourseModal>() {        @Override        public boolean areItemsTheSame(CourseModal oldItem, CourseModal newItem) {            return oldItem.getId() == newItem.getId();        }          @Override        public boolean areContentsTheSame(CourseModal oldItem, CourseModal newItem) {            // below line is to check the course name, description and course duration.            return oldItem.getCourseName().equals(newItem.getCourseName()) &&                    oldItem.getCourseDescription().equals(newItem.getCourseDescription()) &&                    oldItem.getCourseDuration().equals(newItem.getCourseDuration());        }    };      @NonNull    @Override    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {        // below line is use to inflate our layout        // file for each item of our recycler view.        View item = LayoutInflater.from(parent.getContext())                .inflate(R.layout.course_rv_item, parent, false);        return new ViewHolder(item);    }      @Override    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {        // below line of code is use to set data to        // each item of our recycler view.        CourseModal model = getCourseAt(position);        holder.courseNameTV.setText(model.getCourseName());        holder.courseDescTV.setText(model.getCourseDescription());        holder.courseDurationTV.setText(model.getCourseDuration());    }      // creating a method to get course modal for a specific position.    public CourseModal getCourseAt(int position) {        return getItem(position);    }      public class ViewHolder extends RecyclerView.ViewHolder {        // view holder class to create a variable for each view.        TextView courseNameTV, courseDescTV, courseDurationTV;          ViewHolder(@NonNull View itemView) {            super(itemView);            // initializing each view of our recycler view.            courseNameTV = itemView.findViewById(R.id.idTVCourseName);            courseDescTV = itemView.findViewById(R.id.idTVCourseDescription);            courseDurationTV = itemView.findViewById(R.id.idTVCourseDuration);                          // adding on click listener for each item of recycler view.            itemView.setOnClickListener(new View.OnClickListener() {                @Override                public void onClick(View v) {                    // inside on click listener we are passing                     // position to our item of recycler view.                    int position = getAdapterPosition();                    if (listener != null && position != RecyclerView.NO_POSITION) {                        listener.onItemClick(getItem(position));                    }                }            });        }    }      public interface OnItemClickListener {        void onItemClick(CourseModal model);    }    public void setOnItemClickListener(OnItemClickListener listener) {        this.listener = listener;    }}
Step 11: Creating a new Activity for Adding and Updating our Course
Navigate to the app > java > your app’s package name > Right-click on it > New > Empty Activity and name it as NewCourseActivity and go to XML part and add below code to it. Below is the code for the activity_new_course.xml file.
XML
<?xml version="1.0" encoding="utf-8"?><LinearLayout     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"    android:orientation="vertical"    tools:context=".NewCourseActivity">          <!--edit text for our course name-->    <EditText        android:id="@+id/idEdtCourseName"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:layout_margin="10dp"        android:hint="Enter Course Name" />      <!--edit text for our course description-->    <EditText        android:id="@+id/idEdtCourseDescription"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:layout_margin="10dp"        android:hint="Enter Course Description" />      <!--edit text for course description-->    <EditText        android:id="@+id/idEdtCourseDuration"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:layout_margin="10dp"        android:hint="Course Duration" />      <!--button for saving data to room database-->    <Button        android:id="@+id/idBtnSaveCourse"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:layout_margin="10dp"        android:padding="5dp"        android:text="Save your course"        android:textAllCaps="false" />      </LinearLayout>
Step 12: Working with the NewCourseActivity.java file
Navigate to the app > java > your app’s package name > NewCourseActivity.java file and add the below code to it. Comments are added inside the code to understand the code in more detail.
Java
import android.content.Intent;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;  import androidx.appcompat.app.AppCompatActivity;  public class NewCourseActivity extends AppCompatActivity {      // creating a variables for our button and edittext.    private EditText courseNameEdt, courseDescEdt, courseDurationEdt;    private Button courseBtn;      // creating a constant string variable for our     // course name, description and duration.    public static final String EXTRA_ID = "com.gtappdevelopers.gfgroomdatabase.EXTRA_ID";    public static final String EXTRA_COURSE_NAME = "com.gtappdevelopers.gfgroomdatabase.EXTRA_COURSE_NAME";    public static final String EXTRA_DESCRIPTION = "com.gtappdevelopers.gfgroomdatabase.EXTRA_COURSE_DESCRIPTION";    public static final String EXTRA_DURATION = "com.gtappdevelopers.gfgroomdatabase.EXTRA_COURSE_DURATION";          @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_new_course);                  // initializing our variables for each view.        courseNameEdt = findViewById(R.id.idEdtCourseName);        courseDescEdt = findViewById(R.id.idEdtCourseDescription);        courseDurationEdt = findViewById(R.id.idEdtCourseDuration);        courseBtn = findViewById(R.id.idBtnSaveCourse);                  // below line is to get intent as we        // are getting data via an intent.        Intent intent = getIntent();        if (intent.hasExtra(EXTRA_ID)) {            // if we get id for our data then we are            // setting values to our edit text fields.            courseNameEdt.setText(intent.getStringExtra(EXTRA_COURSE_NAME));            courseDescEdt.setText(intent.getStringExtra(EXTRA_DESCRIPTION));            courseDurationEdt.setText(intent.getStringExtra(EXTRA_DURATION));        }        // adding on click listener for our save button.        courseBtn.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                // getting text value from edittext and validating if                // the text fields are empty or not.                String courseName = courseNameEdt.getText().toString();                String courseDesc = courseDescEdt.getText().toString();                String courseDuration = courseDurationEdt.getText().toString();                if (courseName.isEmpty() || courseDesc.isEmpty() || courseDuration.isEmpty()) {                    Toast.makeText(NewCourseActivity.this, "Please enter the valid course details.", Toast.LENGTH_SHORT).show();                    return;                }                // calling a method to save our course.                saveCourse(courseName, courseDesc, courseDuration);            }        });    }      private void saveCourse(String courseName, String courseDescription, String courseDuration) {        // inside this method we are passing         // all the data via an intent.        Intent data = new Intent();                  // in below line we are passing all our course detail.        data.putExtra(EXTRA_COURSE_NAME, courseName);        data.putExtra(EXTRA_DESCRIPTION, courseDescription);        data.putExtra(EXTRA_DURATION, courseDuration);        int id = getIntent().getIntExtra(EXTRA_ID, -1);        if (id != -1) {            // in below line we are passing our id.            data.putExtra(EXTRA_ID, id);        }                  // at last we are setting result as data.        setResult(RESULT_OK, data);                  // displaying a toast message after adding the data        Toast.makeText(this, "Course has been saved to Room Database. ", Toast.LENGTH_SHORT).show();    }}
Step 13: Working with the MainActivity.java file
Navigate to the app > java > your app’s package name > MainActivity.java file and add the below code to it. Comments are added inside the code to understand the code in more detail.
Java
import android.content.Intent;import android.os.Bundle;import android.view.View;import android.widget.Toast;  import androidx.annotation.NonNull;import androidx.annotation.Nullable;import androidx.appcompat.app.AppCompatActivity;import androidx.lifecycle.Observer;import androidx.lifecycle.ViewModelProviders;import androidx.recyclerview.widget.ItemTouchHelper;import androidx.recyclerview.widget.LinearLayoutManager;import androidx.recyclerview.widget.RecyclerView;  import com.google.android.material.floatingactionbutton.FloatingActionButton;  import java.util.List;  public class MainActivity extends AppCompatActivity {      // creating a variables for our recycler view.    private RecyclerView coursesRV;    private static final int ADD_COURSE_REQUEST = 1;    private static final int EDIT_COURSE_REQUEST = 2;    private ViewModal viewmodal;      @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);                 // initializing our variable for our recycler view and fab.        coursesRV = findViewById(R.id.idRVCourses);        FloatingActionButton fab = findViewById(R.id.idFABAdd);          // adding on click listener for floating action button.        fab.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                // starting a new activity for adding a new course                 // and passing a constant value in it.                Intent intent = new Intent(MainActivity.this, NewCourseActivity.class);                startActivityForResult(intent, ADD_COURSE_REQUEST);            }        });          // setting layout manager to our adapter class.        coursesRV.setLayoutManager(new LinearLayoutManager(this));        coursesRV.setHasFixedSize(true);                 // initializing adapter for recycler view.        final CourseRVAdapter adapter = new CourseRVAdapter();                  // setting adapter class for recycler view.        coursesRV.setAdapter(adapter);                  // passing a data from view modal.        viewmodal = ViewModelProviders.of(this).get(ViewModal.class);                 // below line is use to get all the courses from view modal.        viewmodal.getAllCourses().observe(this, new Observer<List<CourseModal>>() {            @Override            public void onChanged(List<CourseModal> models) {                // when the data is changed in our models we are                // adding that list to our adapter class.                adapter.submitList(models);            }        });        // below method is use to add swipe to delete method for item of recycler view.        new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {            @Override            public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {                return false;            }              @Override            public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {                // on recycler view item swiped then we are deleting the item of our recycler view.                viewmodal.delete(adapter.getCourseAt(viewHolder.getAdapterPosition()));                Toast.makeText(MainActivity.this, "Course deleted", Toast.LENGTH_SHORT).show();            }        }).                // below line is use to attach this to recycler view.                        attachToRecyclerView(coursesRV);        // below line is use to set item click listener for our item of recycler view.        adapter.setOnItemClickListener(new CourseRVAdapter.OnItemClickListener() {            @Override            public void onItemClick(CourseModal model) {                // after clicking on item of recycler view                // we are opening a new activity and passing                 // a data to our activity.                Intent intent = new Intent(MainActivity.this, NewCourseActivity.class);                intent.putExtra(NewCourseActivity.EXTRA_ID, model.getId());                intent.putExtra(NewCourseActivity.EXTRA_COURSE_NAME, model.getCourseName());                intent.putExtra(NewCourseActivity.EXTRA_DESCRIPTION, model.getCourseDescription());                intent.putExtra(NewCourseActivity.EXTRA_DURATION, model.getCourseDuration());                                  // below line is to start a new activity and                 // adding a edit course constant.                startActivityForResult(intent, EDIT_COURSE_REQUEST);            }        });    }      @Override    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {        super.onActivityResult(requestCode, resultCode, data);        if (requestCode == ADD_COURSE_REQUEST && resultCode == RESULT_OK) {            String courseName = data.getStringExtra(NewCourseActivity.EXTRA_COURSE_NAME);            String courseDescription = data.getStringExtra(NewCourseActivity.EXTRA_DESCRIPTION);            String courseDuration = data.getStringExtra(NewCourseActivity.EXTRA_DURATION);            CourseModal model = new CourseModal(courseName, courseDescription, courseDuration);            viewmodal.insert(model);            Toast.makeText(this, "Course saved", Toast.LENGTH_SHORT).show();        } else if (requestCode == EDIT_COURSE_REQUEST && resultCode == RESULT_OK) {            int id = data.getIntExtra(NewCourseActivity.EXTRA_ID, -1);            if (id == -1) {                Toast.makeText(this, "Course can't be updated", Toast.LENGTH_SHORT).show();                return;            }            String courseName = data.getStringExtra(NewCourseActivity.EXTRA_COURSE_NAME);            String courseDesc = data.getStringExtra(NewCourseActivity.EXTRA_DESCRIPTION);            String courseDuration = data.getStringExtra(NewCourseActivity.EXTRA_DURATION);            CourseModal model = new CourseModal(courseName, courseDesc, courseDuration);            model.setId(id);            viewmodal.update(model);            Toast.makeText(this, "Course updated", Toast.LENGTH_SHORT).show();        } else {            Toast.makeText(this, "Course not saved", Toast.LENGTH_SHORT).show();        }    }}
Now run your app and see the output of the app. 
Check out the project on the below link: https://github.com/ChaitanyaMunje/GFG-Room-Database
kapoorsagar226
android
Technical Scripter 2020
Android
Java
Technical Scripter
Java
Android
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
How to Create and Add Data to SQLite Database in Android?
Resource Raw Folder in Android Studio
Broadcast Receiver in Android With Example
Services in Android with Example
Android RecyclerView in Kotlin
Arrays in Java
Split() String method in Java with examples
For-each loop in Java
Object Oriented Programming (OOPs) Concept in Java
HashMap in Java with Examples