2017-06-21 53 views
0

在浏览关于此主题的其他问题后,我一直无法找到我的错误的来源。从共享首选项中书写和读取不能正常工作

我在SharedPreferences中存储名为Assignments的自定义对象的JSON字符串。

这里是我的Assignment.save()方法

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

我也有一个需要阅读sharedPreferences所有的作业,然后将其反序列化到的分配对象名单,并返回它loadAllAssignments方法。

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

该错误是在prefs.getAll发生()行,因为我没有得到任何来自SharedPreferences文件的密钥。有没有人有一些想法,为什么发生这种情况?

这里是我使用来测试它的代码

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

预先感谢您

+1

你需要调用'editor.commit()'你把数据放到sharedPreferences后... – Opiatefuchs

+0

谢谢。我对Android非常陌生。 –

+0

非常欢迎.. – Opiatefuchs

回答

1

你需要添加一些数据到你sharedPreferences之后调用editor.commit()。所以你方法必须是:

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