Search code examples
javaandroidinternal-storageandroid-internal-storage

How to save the data a user inputs into the device's local internal storage?


I'm developing a Grade/GPA Calculator app on Android during my free time. What the app basically does until now is let the user add Semesters in the Main Activity and when the user clicks on a certain Semester the user is redirected to another Activity where the user can add new Courses for that specific semester. The problem I'm having is that when the user hits on the back button to go to to the Main Activity where the Semesters are located the courses that were added in that semester are erased. The same happens when I go to the phone's homepage and re-launch the app, everything that the user had created has been deleted.

I'm pretty sure my problem is that I'm not saving the data that the user creates to the phone's storage/app's storage, but I can't seem to figure out on how to do this. If anyone can point me in the right direction I would appreciate it. Thanks!

This is my MainActivity class's code: (My MainActivity is where Semesters are added)

package com.example.gradecalculator;

import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;

import java.util.ArrayList;
import java.util.Random;

public class MainActivity extends AppCompatActivity {

    // Private Fields
    private Dialog d;
    private EditText semesterName;
    private ListView semesterListView;
    private ArrayList<String> semesterArray = new ArrayList<String>();
    private SemesterAdapter customSemesterAdapter;
    private ArrayList<Semester> mySemesters = new ArrayList<>();
    private ArrayList<String> semesterBackgrounds = new ArrayList<String>();
    private String getSemesterName;
    private int randomBackground[] = new int[7];

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Initiating toolbar
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        // Making a new dialog
        d = new Dialog(this);

        // Initializing variables
        semesterName = (EditText) d.findViewById(R.id.editTextSemesterName);
        semesterListView = (ListView) findViewById(R.id.semesterList);

        // Calling the removeSemesters() method
        removeSemesters();

        // Adding backgrounds to the backgrounds ArrayList
        semesterBackgrounds.add("orange_background");
        semesterBackgrounds.add("green_background");
        semesterBackgrounds.add("aqua_background");
        semesterBackgrounds.add("blue_background");
        semesterBackgrounds.add("pink_background");
        semesterBackgrounds.add("purple_background");
        semesterBackgrounds.add("red_background");
        semesterBackgrounds.add("yellow_background");
    }

    // Creating a custom Menu
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.top_menu, menu);
        return true;
    }

    // Buttons in the custom Menu
    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()) {
            case R.id.editButton:
                Toast.makeText(this, "Delete the desired Semesters by clicking on the trash button located to the right of each Semester", Toast.LENGTH_LONG).show();
                return true;
        }
        return super.onOptionsItemSelected(item);
    }

    // When user clicks on "+New Semester" button open a popup where the user is prompted to
    // type in the Semester Name and when "Done" is clicked the new semester appears in the Main
    // Activity
    public void newSemesterPopup(View v) {
        TextView closePopup;
        ImageButton doneButton;

        d.setContentView(R.layout.new_semester_popup);

        semesterName = (EditText) d.findViewById(R.id.editTextSemesterName);
        semesterListView = (ListView) findViewById(R.id.semesterList);

        doneButton = (ImageButton) d.findViewById(R.id.doneButton);
        doneButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                addSemesters();
            }
        });

        closePopup = (TextView) d.findViewById(R.id.exitButton);
        closePopup.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                d.dismiss();
            }
        });
        d.show();
    }

    // Adds semesters to Main Activity
    public void addSemesters() {
        getSemesterName = semesterName.getText().toString();

        if (semesterArray.contains(getSemesterName)) {
            Toast.makeText(getBaseContext(), "Semester Name Already Exists", Toast.LENGTH_SHORT).show();
        } else if (getSemesterName == null || getSemesterName.trim().equals("")) {
            Toast.makeText(getBaseContext(), "Cannot Add Empty Semester Name", Toast.LENGTH_SHORT).show();
        } else {
            semesterArray.add(getSemesterName);
            mySemesters.add(new Semester(getSemesterName, semesterBackgrounds.get(new Random().nextInt(randomBackground.length))));
            customSemesterAdapter = new SemesterAdapter(getApplicationContext(), R.layout.semester_row, mySemesters);
            semesterListView.setAdapter(customSemesterAdapter);
            d.dismiss();
        }
    }

    // Removes unwanted semesters from Main Activity
    public void removeSemesters() {
        semesterListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view, final int position, long id) {

                AlertDialog.Builder deleteAlert = new AlertDialog.Builder(MainActivity.this);
                deleteAlert.setTitle("Semester Deletion Process");
                deleteAlert.setMessage("Are you sure you want to delete the selected Semesters?");
                deleteAlert.setNegativeButton("No! Cancel", null);
                deleteAlert.setPositiveButton("Yes! Delete", new AlertDialog.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {

                        customSemesterAdapter.remove(customSemesterAdapter.getItem(position));
                        semesterArray.remove(position);
                        customSemesterAdapter.notifyDataSetChanged();
                        Toast.makeText(MainActivity.this, "Semester Deleted Successfully.", Toast.LENGTH_SHORT).show();
                    }
                });
                deleteAlert.show();
                return false;
            }
        });
        openSemestersActivity();
    }

    // Open the SemesterActivity and uses .putExtra to pass data to the SemesterActivity to tell it what semester to render
    // data accordingly
    public void openSemestersActivity() {
        final Intent semester = new Intent(this, SemesterActivity.class);
        semesterListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                semester.putExtra("semester", semesterName.getText().toString());
                startActivity(semester);
            }
        });
    }
}

This is my SemesterActivity code: (My SemestersActivity is where Courses are added)

package com.example.gradecalculator;

import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;

import java.util.ArrayList;
import java.util.Random;

public class SemesterActivity extends AppCompatActivity {

    // Private Fields
    private Dialog d;
    private EditText courseName;
    private EditText courseCode;
    private EditText courseCredits;
    private ListView courseListView;
    private ArrayList<String> courseArray = new ArrayList<String>();
    private CourseAdapter customCourseAdapter;
    private ArrayList<Course> myCourses = new ArrayList<>();
    private ArrayList<String> coursesBackgrounds = new ArrayList<String>();
    private String getCourseName;
    private String getCourseCode;
    private String getCourseCredits;
    private int randomBackground[] = new int[7];
    private TextView courseNameView;
    private TextView courseCodeView;
    private TextView courseCreditsView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_semester);

        d = new Dialog(this);

        courseNameView = (TextView) d.findViewById(R.id.editTextCourseName);
        courseCodeView = (TextView) d.findViewById(R.id.editTextCourseCode);
        courseCreditsView = (TextView) d.findViewById(R.id.editTextCourseCredits);
        courseListView = (ListView) findViewById(R.id.coursesList);

        // Retrieving the Extra and determining the semester we want to load
        Intent myIntent = getIntent();
        String semester = myIntent.getStringExtra("semester");

        removeCourses();

        // Initiating toolbar
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        // Adding backgrounds to the backgrounds ArrayList
        coursesBackgrounds.add("orange_background_big");
        coursesBackgrounds.add("green_background_big");
        coursesBackgrounds.add("aqua_background_big");
        coursesBackgrounds.add("blue_background_big");
        coursesBackgrounds.add("pink_background_big");
        coursesBackgrounds.add("purple_background_big");
        coursesBackgrounds.add("red_background_big");
        coursesBackgrounds.add("yellow_background_big");
    }

    // Creating a custom Menu
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.top_menu, menu);
        return true;
    }

    // Buttons in the custom Menu
    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()) {
            case R.id.editButton:
                Toast.makeText(this, "Delete the desired Courses by clicking on the trash button located to the right of each Semester", Toast.LENGTH_LONG).show();
                return true;
        }
        return super.onOptionsItemSelected(item);
    }

    // New course popup
    public void newCoursePopup(View v) {
        TextView closePopup;
        ImageButton doneButton;

        d.setContentView(R.layout.new_course_popup);

        courseName = (EditText) d.findViewById(R.id.editTextCourseName);
        courseCode = (EditText) d.findViewById(R.id.editTextCourseCode);
        courseCredits = (EditText) d.findViewById(R.id.editTextCourseCredits);

        doneButton = (ImageButton) d.findViewById(R.id.doneButton);
        doneButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                addCourses();
            }
        });

        closePopup = (TextView) d.findViewById(R.id.exitButton);
        closePopup.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                d.dismiss();
            }
        });
        d.show();
    }

    // Adding courses to the Semester
    public void addCourses() {
        getCourseName = courseName.getText().toString();
        getCourseCode = courseCode.getText().toString();
        getCourseCredits = courseCredits.getText().toString();

        if(courseArray.contains(getCourseName)) {
            Toast.makeText(getBaseContext(), "Course Name Already Exists", Toast.LENGTH_SHORT).show();
        }
        else if(getCourseName == null || getCourseName.trim().equals("")) {
            Toast.makeText(getBaseContext(), "Cannot Add Empty Course Name", Toast.LENGTH_SHORT).show();
        }
        else {
            courseArray.add(getCourseName);
            myCourses.add(new Course(getCourseName, getCourseCode, getCourseCredits, coursesBackgrounds.get(new Random().nextInt(randomBackground.length))));
            customCourseAdapter = new CourseAdapter(getApplicationContext(), R.layout.course_row, myCourses);
            courseListView.setAdapter(customCourseAdapter);
            d.dismiss();
        }
    }

    // Removing courses from the Semester
    public void removeCourses() {
        courseListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view, final int position, long id) {

                AlertDialog.Builder deleteAlert = new AlertDialog.Builder(SemesterActivity.this);
                deleteAlert.setTitle("Course Deletion Process");
                deleteAlert.setMessage("Are you sure you want to delete the selected Courses?");
                deleteAlert.setNegativeButton("No! Cancel", null);
                deleteAlert.setPositiveButton("Yes! Delete", new AlertDialog.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {

                        customCourseAdapter.remove(customCourseAdapter.getItem(position));
                        courseArray.remove(position);
                        customCourseAdapter.notifyDataSetInvalidated();
                        Toast.makeText(SemesterActivity.this, "Course Deleted Successfully", Toast.LENGTH_SHORT).show();
                    }
                });
                deleteAlert.show();
                return false;
            }
        });
    }
}

Solution

  • There are a couple of databases you can look into; You can use Room or Realm. You can also check out online DBs like Firestore by Firebase. The beauty about having an online db a user(Student) can access their data from a different phone if they lose or replace their current one. A recommended way to go is to have both to cover both scenarios.