2017-06-21 44 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(); 
    }