In the previous article, we have seen adding data to the realm database in Android. In this article, we will take a look at reading this data from our Realm Database in the Android app.
What we are going to build in this article?
In this article, we will be simply adding a Button to open a new activity in the project which we have created in the previous article. Inside the new activity, we will display data in the form of RecyclerView. Below is the video in which we will get to see what we are going to build in this article.
Step by Step Implementation
Step 1: Add google repository in the build.gradle file of the application project.
buildscript {
repositories {
google()
mavenCentral()
}
All Jetpack components are available in the Google Maven repository, include them in the build.gradle file.
allprojects {
repositories {
google()
mavenCentral()
}
}
Step 2: Working with the activity_main.xml file
Go to the activity_main.xml file and add a new Button to open a new activity for displaying our list of courses.
<!--Button for reading your course to database--> < Button
android:id = "@+id/idBtnReadData"
android:layout_width = "match_parent"
android:layout_height = "wrap_content"
android:visibility = "visible"
android:layout_margin = "10dp"
android:text = "Read Course Details"
android:textAllCaps = "false" />
|
Now below is the updated code for the activity_main.xml file after adding the above code snippet.
<? xml version = "1.0" encoding = "utf-8" ?>
< LinearLayout
android:layout_width = "match_parent"
android:layout_height = "match_parent"
android:orientation = "vertical"
tools:context = ".MainActivity" >
<!--Edit text to enter 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 to enter course duration-->
< EditText
android:id = "@+id/idEdtCourseDuration"
android:layout_width = "match_parent"
android:layout_height = "wrap_content"
android:layout_margin = "10dp"
android:hint = "Enter Course Duration" />
<!--edit text to display course tracks-->
< EditText
android:id = "@+id/idEdtCourseTracks"
android:layout_width = "match_parent"
android:layout_height = "wrap_content"
android:layout_margin = "10dp"
android:hint = "Enter Course Tracks" />
<!--edit text for 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" />
<!--button for adding new course-->
< Button
android:id = "@+id/idBtnAddCourse"
android:layout_width = "match_parent"
android:layout_height = "wrap_content"
android:layout_margin = "10dp"
android:text = "Add Course"
android:textAllCaps = "false" />
<!--Button for reading your course to database-->
< Button
android:id = "@+id/idBtnReadData"
android:layout_width = "match_parent"
android:layout_height = "wrap_content"
android:layout_margin = "10dp"
android:text = "Read Course Details"
android:textAllCaps = "false"
android:visibility = "visible" />
</ LinearLayout >
|
Step 3: Working with the MainActivity.java file
As we have added a new button to our activity_main.xml file, so we have to add setOnClickListener() to that button in our MainActivity.java file.
readCourseBtn.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(MainActivity. this , ReadCoursesActivity. class );
startActivity(i);
}
}); |
Below is the updated code for the MainActivity.java file after adding the above code snippet.
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import io.realm.Realm;
public class MainActivity extends AppCompatActivity {
// creating variables for our edit text
private EditText courseNameEdt, courseDurationEdt, courseDescriptionEdt, courseTracksEdt;
private Realm realm;
private Button readCourseBtn;
// creating a strings for storing
// our values from edittext fields.
private String courseName, courseDuration, courseDescription, courseTracks;
@Override
protected void onCreate(Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// initializing our edittext and buttons
realm = Realm.getDefaultInstance();
courseNameEdt = findViewById(R.id.idEdtCourseName);
courseDescriptionEdt = findViewById(R.id.idEdtCourseDescription);
courseDurationEdt = findViewById(R.id.idEdtCourseDuration);
readCourseBtn = findViewById(R.id.idBtnReadData);
// creating variable for button
Button submitCourseBtn = findViewById(R.id.idBtnAddCourse);
courseTracksEdt = findViewById(R.id.idEdtCourseTracks);
submitCourseBtn.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View v) {
// getting data from edittext fields.
courseName = courseNameEdt.getText().toString();
courseDescription = courseDescriptionEdt.getText().toString();
courseDuration = courseDurationEdt.getText().toString();
courseTracks = courseTracksEdt.getText().toString();
// validating the text fields if empty or not.
if (TextUtils.isEmpty(courseName)) {
courseNameEdt.setError( "Please enter Course Name" );
} else if (TextUtils.isEmpty(courseDescription)) {
courseDescriptionEdt.setError( "Please enter Course Description" );
} else if (TextUtils.isEmpty(courseDuration)) {
courseDurationEdt.setError( "Please enter Course Duration" );
} else if (TextUtils.isEmpty(courseTracks)) {
courseTracksEdt.setError( "Please enter Course Tracks" );
} else {
// calling method to add data to Realm database..
addDataToDatabase(courseName, courseDescription, courseDuration, courseTracks);
Toast.makeText(MainActivity. this , "Course added to database.." , Toast.LENGTH_SHORT).show();
courseNameEdt.setText( "" );
courseDescriptionEdt.setText( "" );
courseDurationEdt.setText( "" );
courseTracksEdt.setText( "" );
}
}
});
readCourseBtn.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(MainActivity. this , ReadCoursesActivity. class );
startActivity(i);
}
});
}
private void addDataToDatabase(String courseName, String courseDescription, String courseDuration, String courseTracks) {
// on below line we are creating
// a variable for our modal class.
DataModal modal = new DataModal();
// on below line we are getting id for the course which we are storing.
Number id = realm.where(DataModal. class ).max( "id" );
// on below line we are
// creating a variable for our id.
long nextId;
// validating if id is null or not.
if (id == null ) {
// if id is null
// we are passing it as 1.
nextId = 1 ;
} else {
// if id is not null then
// we are incrementing it by 1
nextId = id.intValue() + 1 ;
}
// on below line we are setting the
// data entered by user in our modal class.
modal.setId(nextId);
modal.setCourseDescription(courseDescription);
modal.setCourseName(courseName);
modal.setCourseDuration(courseDuration);
modal.setCourseTracks(courseTracks);
// on below line we are calling a method to execute a transaction.
realm.executeTransaction( new Realm.Transaction() {
@Override
public void execute(Realm realm) {
// inside on execute method we are calling a method
// to copy to real m database from our modal class.
realm.copyToRealm(modal);
}
});
}
} |
Step 4: Creating a new Activity for displaying our list of courses
To create a new Activity we have to navigate to the app > java > your app’s package name > Right click on package name > New > Empty Activity and name your activity as ReadCoursesActivity and create new Activity. Make sure to select the empty activity.
Step 5: Creating a new layout file for our 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 the below code to it.
<? xml version = "1.0" encoding = "utf-8" ?>
< androidx.cardview.widget.CardView
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" >
<!--text view for our course name-->
< TextView
android:id = "@+id/idTVCourseName"
android:layout_width = "match_parent"
android:layout_height = "wrap_content"
android:padding = "3dp"
android:text = "Course Name"
android:textColor = "@color/black" />
< LinearLayout
android:layout_width = "match_parent"
android:layout_height = "wrap_content"
android:orientation = "horizontal"
android:weightSum = "2" >
<!--text view for our course tracks-->
< TextView
android:id = "@+id/idTVCourseTracks"
android:layout_width = "0dp"
android:layout_height = "wrap_content"
android:layout_weight = "1"
android:padding = "3dp"
android:text = "Course Tracks"
android:textColor = "@color/black" />
<!--text view for our course duration-->
< TextView
android:id = "@+id/idTVCourseDuration"
android:layout_width = "0dp"
android:layout_height = "wrap_content"
android:layout_weight = "1"
android:padding = "3dp"
android:text = "Duration"
android:textColor = "@color/black" />
</ LinearLayout >
<!--text view for our course description-->
< TextView
android:id = "@+id/idTVCourseDescription"
android:layout_width = "match_parent"
android:layout_height = "wrap_content"
android:layout_weight = "1"
android:padding = "3dp"
android:text = "Description"
android:textColor = "@color/black" />
</ LinearLayout >
</ androidx.cardview.widget.CardView >
|
Step 6: Creating an Adapter class for setting data to our items 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.
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.List;
public class CourseRVAdapter extends RecyclerView.Adapter<CourseRVAdapter.ViewHolder> {
// variable for our array list and context
private List<DataModal> dataModalArrayList;
private Context context;
public CourseRVAdapter(List<DataModal> dataModalArrayList, Context context) {
this .dataModalArrayList = dataModalArrayList;
this .context = context;
}
@NonNull
@Override
public CourseRVAdapter.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_rv_item, parent, false );
return new ViewHolder(view);
}
@Override
public void onBindViewHolder( @NonNull CourseRVAdapter.ViewHolder holder, int position) {
DataModal modal = dataModalArrayList.get(position);
holder.courseNameTV.setText(modal.getCourseName());
holder.courseDescTV.setText(modal.getCourseDescription());
holder.courseDurationTV.setText(modal.getCourseDuration());
holder.courseTracksTV.setText(modal.getCourseTracks());
}
@Override
public int getItemCount() {
return dataModalArrayList.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
// creating variables for our text views.
private TextView courseNameTV, courseDescTV, courseDurationTV, courseTracksTV;
public ViewHolder( @NonNull View itemView) {
super (itemView);
// initializing our text views
courseNameTV = itemView.findViewById(R.id.idTVCourseName);
courseDescTV = itemView.findViewById(R.id.idTVCourseDescription);
courseDurationTV = itemView.findViewById(R.id.idTVCourseDuration);
courseTracksTV = itemView.findViewById(R.id.idTVCourseTracks);
}
}
} |
Step 7: Working with the activity_read_courses.xml file
Navigate to the app > res > layout > activity_read_courses.xml and add the below code to that file. Below is the code for the activity_read_courses.xml file.
<? xml version = "1.0" encoding = "utf-8" ?>
< RelativeLayout
android:layout_width = "match_parent"
android:layout_height = "match_parent"
tools:context = ".ReadCoursesActivity" >
<!--recycler view for displaying list of courses-->
< androidx.recyclerview.widget.RecyclerView
android:id = "@+id/idRVCourses"
android:layout_width = "match_parent"
android:layout_height = "match_parent" />
</ RelativeLayout >
|
Step 8: Working with the ReadCoursesActivity.java file
Navigate to the app > java > your app’s package name > ReadCoursesActivity.java file and add the below code to it. Comments are added inside the code to understand the code in more detail.
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
import java.util.List;
import io.realm.Realm;
public class ReadCoursesActivity extends AppCompatActivity {
List<DataModal> dataModals;
// creating variables for realm,
// recycler view, adapter and our list.
private Realm realm;
private RecyclerView coursesRV;
private CourseRVAdapter courseRVAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
setContentView(R.layout.activity_read_courses);
// on below lines we are initializing our variables.
coursesRV = findViewById(R.id.idRVCourses);
realm = Realm.getDefaultInstance();
dataModals = new ArrayList<>();
// calling a method to load
// our recycler view with data.
prepareRecyclerView();
}
private void prepareRecyclerView() {
// on below line we are getting data from realm database in our list.
dataModals = realm.where(DataModal. class ).findAll();
// on below line we are adding our list to our adapter class.
courseRVAdapter = new CourseRVAdapter(dataModals, this );
// on below line we are setting layout manager to our recycler view.
coursesRV.setLayoutManager( new LinearLayoutManager( this ));
// at last we are setting adapter to our recycler view.
coursesRV.setAdapter(courseRVAdapter);
}
} |
Now run your app and see the output of the app.
Output:
Below is the complete project file structure after performing the read operation: