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.
// 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.
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 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.
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: