In the previous article, we have seen adding as well as reading data from our Bac4App database in the Android app. In this article, we will take a look at Updating this data in your database.
What we are going to build in this article?
We will be building a simple application in which we will be updating the previously added data in our Back4App database.
Step by Step Implementation
Step 1: Creating a new Activity for updating the data
For creating a new Activity navigate to the app > res > layout > Right-Click on it and click on New > then click on Empty Activity to create a new Activity, and we will name it as UpdateCourseActivity.
Step 2: Updating our Adapter class for opening a new activity on clicking the RecyclerView item
As we have created our Adapter class in the previous article for displaying the list of courses in Recycler View. In this article, we will add onClickListener() inside that Adapter class for RecyclerView item click listener. Add the following code snippet to the CourseRVAdapter.java file.
Java
// adding on click listener for our item of recycler view. holder.itemView.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { // calling a intent to open new activity. Intent i = new Intent(context, UpdateCourseActivity. class ); // on below line we are passing data to our intent on below line. i.putExtra( "courseName" , courses.getCourseName()); i.putExtra( "courseDescription" , courses.getCourseDescription()); i.putExtra( "courseDuration" , courses.getCourseDuration()); // starting our activity on below line. context.startActivity(i); } }); } |
Below is the updated code for the CourseRVAdapter.java file.
Java
import android.content.Context; import android.content.Intent; 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.ArrayList; public class CourseRVAdapter extends RecyclerView.Adapter<CourseRVAdapter.ViewHolder> { private Context context; private ArrayList<CourseModal> courseModalArrayList; // creating a constructor class. public CourseRVAdapter(Context context, ArrayList<CourseModal> courseModalArrayList) { this .context = context; this .courseModalArrayList = courseModalArrayList; } @NonNull @Override public CourseRVAdapter.ViewHolder onCreateViewHolder( @NonNull ViewGroup parent, int viewType) { // passing our layout file for displaying our card item return new ViewHolder(LayoutInflater.from(context).inflate(R.layout.course_rv_item, parent, false )); } @Override public void onBindViewHolder( @NonNull CourseRVAdapter.ViewHolder holder, int position) { // setting data to our text views from our modal class. CourseModal courses = courseModalArrayList.get(position); holder.courseNameTV.setText(courses.getCourseName()); holder.courseDurationTV.setText(courses.getCourseDuration()); holder.courseDescTV.setText(courses.getCourseDescription()); // adding on click listener for our item of recycler view. holder.itemView.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { // calling a intent to open new activity. Intent i = new Intent(context, UpdateCourseActivity. class ); // on below line we are passing data to our intent on below line. i.putExtra( "courseName" , courses.getCourseName()); i.putExtra( "courseDescription" , courses.getCourseDescription()); i.putExtra( "courseDuration" , courses.getCourseDuration()); // starting our activity on below line. context.startActivity(i); } }); } @Override public int getItemCount() { return courseModalArrayList.size(); } public class ViewHolder extends RecyclerView.ViewHolder { // creating variables for our text views. private final TextView courseNameTV; private final TextView courseDurationTV; private final TextView courseDescTV; public ViewHolder( @NonNull View itemView) { super (itemView); // initializing our text views. courseNameTV = itemView.findViewById(R.id.idTVCourseName); courseDurationTV = itemView.findViewById(R.id.idTVCourseDuration); courseDescTV = itemView.findViewById(R.id.idTVCourseDescription); } } } |
Step 3: Working with the activity_update_course.xml file
Navigate to the app > res > layout > activity_update_course.xml and add the below code to it.
XML
<? xml version = "1.0" encoding = "utf-8" ?> < LinearLayout android:layout_width = "match_parent" android:layout_height = "match_parent" android:orientation = "vertical" tools:context = ".UpdateCourseActivity" > <!--Edit text for getting course Name--> < EditText android:id = "@+id/idEdtCourseName" android:layout_width = "match_parent" android:layout_height = "wrap_content" android:layout_marginStart = "10dp" android:layout_marginTop = "20dp" android:layout_marginEnd = "10dp" android:hint = "Course Name" android:importantForAutofill = "no" android:inputType = "text" /> <!--Edittext for getting course Duration--> < EditText android:id = "@+id/idEdtCourseDuration" android:layout_width = "match_parent" android:layout_height = "wrap_content" android:layout_marginStart = "10dp" android:layout_marginTop = "20dp" android:layout_marginEnd = "10dp" android:hint = "Course Duration in min" android:importantForAutofill = "no" android:inputType = "time" /> <!--Edittext for getting course Description--> < EditText android:id = "@+id/idEdtCourseDescription" android:layout_width = "match_parent" android:layout_height = "wrap_content" android:layout_marginStart = "10dp" android:layout_marginTop = "20dp" android:layout_marginEnd = "10dp" android:hint = "Course Description" android:importantForAutofill = "no" android:inputType = "text" /> < LinearLayout android:layout_width = "match_parent" android:layout_height = "wrap_content" android:layout_marginStart = "10dp" android:layout_marginTop = "20dp" android:layout_marginEnd = "10dp" android:orientation = "horizontal" android:weightSum = "2" > <!--button for updating our course--> < Button android:id = "@+id/idBtnUpdate" android:layout_width = "0dp" android:layout_height = "wrap_content" android:layout_weight = "2" android:text = "Update Course" android:textAllCaps = "false" /> </ LinearLayout > </ LinearLayout > |
Step 4: Working with the UpdateCourseActivity.java file
Navigate to the app > java > your app’s package name > UpdateCourseActivity.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.text.TextUtils; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; import com.parse.GetCallback; import com.parse.ParseException; import com.parse.ParseObject; import com.parse.ParseQuery; import com.parse.SaveCallback; public class UpdateCourseActivity extends AppCompatActivity { // creating variables for our edit text private EditText courseNameEdt, courseDurationEdt, courseDescriptionEdt; // creating variable for button private Button updateCourseBtn; // creating a strings for storing our values from edittext fields. private String courseName, courseDuration, courseDescription, originalCourseName, objectID; @Override protected void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_update_course); // initializing our edittext and buttons updateCourseBtn = findViewById(R.id.idBtnUpdate); courseNameEdt = findViewById(R.id.idEdtCourseName); courseDescriptionEdt = findViewById(R.id.idEdtCourseDescription); courseDurationEdt = findViewById(R.id.idEdtCourseDuration); // on below line we are setting data to our edit text field. courseNameEdt.setText(getIntent().getStringExtra( "courseName" )); courseDescriptionEdt.setText(getIntent().getStringExtra( "courseDescription" )); courseDurationEdt.setText(getIntent().getStringExtra( "courseDuration" )); originalCourseName = getIntent().getStringExtra( "courseName" ); updateCourseBtn.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { courseName = courseNameEdt.getText().toString(); courseDescription = courseDescriptionEdt.getText().toString(); courseDuration = courseDurationEdt.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 { // calling method to update data. updateData(originalCourseName, courseName, courseDescription, courseDuration); } } }); } private void updateData(String originalCourseName, String courseName, String courseDescription, String courseDuration) { // Configure Query with our query. ParseQuery<ParseObject> query = ParseQuery.getQuery( "courses" ); // adding a condition where our course name must be equal to the original course name query.whereEqualTo( "courseName" , originalCourseName); // in below method we are getting the unique id // of the course which we have to make update. query.getFirstInBackground( new GetCallback<ParseObject>() { @Override public void done(ParseObject object, ParseException e) { // inside done method we check // if the error is null or not. if (e == null ) { // if the error is null then we are getting // our object id in below line. objectID = object.getObjectId().toString(); // after getting our object id we will // move towards updating our course. // calling below method to update our course. query.getInBackground(objectID, new GetCallback<ParseObject>() { @Override public void done(ParseObject object, ParseException e) { // in this method we are getting the // object which we have to update. if (e == null ) { // in below line we are adding new data // to the object which we get from its id. // on below line we are adding our data // with their key value in our object. object.put( "courseName" , courseName); object.put( "courseDescription" , courseDescription); object.put( "courseDuration" , courseDuration); // after adding new data then we are // calling a method to save this data object.saveInBackground( new SaveCallback() { @Override public void done(ParseException e) { // inside on done method we are checking // if the error is null or not. if (e == null ) { // if the error is null our data has been updated. // we are displaying a toast message and redirecting // our user to home activity where we are displaying course list. Toast.makeText(UpdateCourseActivity. this , "Course Updated.." , Toast.LENGTH_SHORT).show(); Intent i = new Intent(UpdateCourseActivity. this , HomeActivity. class ); startActivity(i); } else { // below line is for error handling. Toast.makeText(UpdateCourseActivity. this , "Fail to update data " + e.getLocalizedMessage(), Toast.LENGTH_SHORT).show(); } } }); } else { // on below line we are displaying a message // if we don't get the object from its id. Toast.makeText(UpdateCourseActivity. this , "Fail to update course " + e.getLocalizedMessage(), Toast.LENGTH_SHORT).show(); } } }); } else { // this is error handling if we don't get the id for our object Toast.makeText(UpdateCourseActivity. this , "Fail to get object ID.." , Toast.LENGTH_SHORT).show(); } } }); } } |
Now run your app and try updating your course. Make sure you have previously added some courses to your list.
Output:
Below is the file structure in Android Studio after performing the Update operation: