0

After looking through several other questions on this topic I haven't been able to find the source of my bug.

I am storing a JSON string of custom object called Assignments in SharedPreferences.

Here is my Assignment.save() method

public void save(Context context) {
        String assignment = _gson.toJson(this);
        SharedPreferences prefs = context.getSharedPreferences(prefs_file, Context.MODE_PRIVATE);
        SharedPreferences.Editor edit = prefs.edit();
        edit.clear();
        edit.putString(this._assignmentName, assignment);
    }

I also have loadAllAssignments method that needs to read all assignments in sharedPreferences and then deserialize them into a list of Assignments Objects and return it.

public static List<Assignment> loadAllAssignments(Context context) {


        List<Assignment> assignments = new ArrayList<>();
        Assignment assignment;
        Gson gson = new Gson();

        Log.d("loadAllAssignments()", "Create SharedPrefs");
        SharedPreferences prefs = context.getSharedPreferences(prefs_file, Context.MODE_PRIVATE);
        Log.d("loadAllAssignments()", "Get all keys");
        Map<String, ?> keys = prefs.getAll();
        Log.d("loadAllAssignments()", "keys " + keys.toString());
        for(Map.Entry<String, ?> entry : keys.entrySet()) {
            Log.d("loadAllAssignments()",entry.getKey() + ": " + entry.getValue().toString());

            String temp = entry.getValue().toString();
            assignment = gson.fromJson(temp, Assignment.class);
            assignments.add(assignment);
            Log.d("loadAllAssignments()", "Loaded: " + assignment.toString());
        }
        return assignments;
    }

The bug is happening at the prefs.getAll() line because I am not getting any of the keys from the SharedPreferences file. Does anyone have some ideas as to why this is happening?

Here is the code I am using to test it

public void SaveLoadAssignments() throws Exception {
        Context appContext = InstrumentationRegistry.getTargetContext();

        Assignment assignment1 =  new Assignment("Midterm", new Rubric());
        for (Integer i = 0; i < 10; i++) {
            assignment1.addStudent("John", i.toString());
        }
        assignment1.save(appContext);

        Assignment assignment2 =  new Assignment("Final", new Rubric());
        for (Integer i = 0; i < 5; i++) {
            assignment2.addStudent("John", i.toString());
        }
        assignment2.save(appContext);

        List<Assignment> assignments = Assignment.loadAllAssignments(appContext);
   }

Thank you in advance

Deric Plummer
  • 117
  • 1
  • 3
  • 10

1 Answers1

1

You need to call editor.commit() after adding some data to your sharedPreferences. SO you method must be:

public void save(Context context) {
        String assignment = _gson.toJson(this);
        SharedPreferences prefs = context.getSharedPreferences(prefs_file, Context.MODE_PRIVATE);
        SharedPreferences.Editor edit = prefs.edit();
        edit.clear();
        edit.putString(this._assignmentName, assignment);
        edit.commit();
    }
Opiatefuchs
  • 9,800
  • 2
  • 36
  • 49