You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:38:23