2017-06-21 2 views
0

Après avoir parcouru plusieurs autres questions sur ce sujet, je n'ai pas réussi à trouver la source de mon bogue.L'écriture et la lecture à partir de préférences partagées ne fonctionnent pas correctement

Je stocke une chaîne JSON d'un objet personnalisé appelé Affectations dans SharedPreferences.

Voici ma méthode

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); 
    } 

J'ai aussi méthode loadAllAssignments Assignment.save() qui a besoin de lire toutes les affectations dans sharedPreferences puis les désérialiser dans une liste des affectations d'objets et de le retourner.

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; 
    } 

Le bug se produit à la ligne prefs.getAll() parce que je ne reçois pas des clés du fichier SharedPreferences. Quelqu'un a-t-il des idées sur les raisons de cette situation?

Voici le code que je utilise pour tester

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); 
    } 

Nous vous remercions à l'avance

+1

vous devez appeler 'editor.commit()' après avoir mis les données en sharedPreferences ... – Opiatefuchs

+0

Merci. Je suis assez nouveau sur Android. –

+0

vous êtes les bienvenus .. – Opiatefuchs

Répondre

1

Vous devez appeler editor.commit() après avoir ajouté des données à votre sharedPreferences. SO vous méthode doit être:

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(); 
    }