使用SharedPreferences+Gson存储用户数据时重复获取同一数据问题
问题分析与解决方案
嘿,我一眼就揪出你代码里的问题啦!你读取SharedPreferences时的循环逻辑犯了个小错误,导致每次都读取到最后一个注册用户的数据。
错误根源
看你读取数据的这段代码:
for(int i=1;i<=howMany;i++) { String json = mPrefs.getString("details" + howMany, ""); // 这里用了howMany而不是i! Student student = gson.fromJson(json, Student.class); Log.e("tag","loop number"+i); Log.e("Tag", student.getName()); }
循环里你拼接的是"details" + howMany,而howMany的值是2(对应第二个用户),所以不管循环到i=1还是i=2,你都在读取details2这个键的值,自然两次输出的都是最后一个用户"Suv"的信息。
修正后的读取代码
把howMany换成循环变量i就解决啦:
SharedPreferences mPrefs = getSharedPreferences("mypref",MODE_PRIVATE); int howMany=mPrefs.getInt("counter",0); Gson gson = new Gson(); for(int i=1;i<=howMany;i++) { String json = mPrefs.getString("details" + i, ""); // 这里改成i Student student = gson.fromJson(json, Student.class); Log.e("tag","loop number"+i); Log.e("Tag", student.getName()); }
这样循环时会依次读取details1、details2,就能正确获取两个用户的信息了。
额外优化建议(可选)
其实你可以换一种更简洁的存储方式:把所有Student对象放到一个List<Student>里,然后将整个列表转成JSON字符串存储,不用单独维护counter和多个键值对。这样代码会更清晰,也不容易出错。
优化后的存储代码:
SharedPreferences preferences = getSharedPreferences("mypref",MODE_PRIVATE); SharedPreferences.Editor prefsEditor=preferences.edit(); Gson gson=new Gson(); // 先读取已有的学生列表 List<Student> studentList = new ArrayList<>(); String existingJson = preferences.getString("student_list", ""); if (!existingJson.isEmpty()) { studentList = gson.fromJson(existingJson, new TypeToken<List<Student>>(){}.getType()); } // 添加新学生 studentList.add(student); // 将更新后的列表存回SharedPreferences String updatedJson = gson.toJson(studentList); prefsEditor.putString("student_list", updatedJson); prefsEditor.commit(); startActivity(intent);
优化后的读取代码:
SharedPreferences mPrefs = getSharedPreferences("mypref",MODE_PRIVATE); Gson gson = new Gson(); String studentListJson = mPrefs.getString("student_list", ""); if (!studentListJson.isEmpty()) { List<Student> studentList = gson.fromJson(studentListJson, new TypeToken<List<Student>>(){}.getType()); for (int i = 0; i < studentList.size(); i++) { Student student = studentList.get(i); Log.e("tag","loop number"+(i+1)); Log.e("Tag", student.getName()); } }
这种方式不用手动管理counter,也避免了循环时键名拼接出错的问题,维护起来更方便。
内容的提问来源于stack exchange,提问作者Pranjal
相关产品推荐
相关产品推荐

