【问题标题】:Unique data isn't fetched when using SharedPreferences使用 SharedPreferences 时不获取唯一数据
【发布时间】:2018-11-01 23:22:55
【问题描述】:

我有一个Activity,用户在上面注册,第二个Activity,到目前为止所有注册的用户,信息都会显示出来。

我知道这可以使用数据库轻松完成,但我想使用SharedPreferences。我正在使用 Gson 存储/检索数据。我有一个班级学生,字段为id(rollno),name

我维护了一个用户数计数器,这个计数器将用于检索方。

将数据保存到共享首选项的代码:

 SharedPreferences preferences = 
    getSharedPreferences("mypref",MODE_PRIVATE);

        SharedPreferences.Editor prefsEditor=preferences.edit();
        Gson gson=new Gson();

        if(preferences.contains("counter")){
            counter=preferences.getInt("counter",0);
            prefsEditor.putInt("counter",++counter);

        }
        else{
            counter=0;
            prefsEditor.putInt("counter",++counter);
        }

        String json = gson.toJson(student);
        prefsEditor.putString("details"+counter,json);
        prefsEditor.commit();

        startActivity(intent);
}

获取SharedPreference的代码:

  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" + howMany, "");
        Student student = gson.fromJson(json, Student.class);
        Log.e("tag","loop number"+i);
        Log.e("Tag", student.getName());
    }

当应用程序启动时,我的第一个用户名是“Pra”,并且在第一个Activity 上单击了提交按钮,因此将其存储在SharedPreferences 中。

第二个用户的名字是“Suv”,这个值也存储在SharedPreferences中。现在的问题是第一个用户的名称的值也发生了变化。我不明白。

我维护了计数器,以便每个对象在 SharedPreferences 中都有唯一的条目,但日志显示:

05-23 10:45:48.208 18409-18409/com.example.com.applicationstudent 
E/tag: counter: 2
05-23 10:45:48.212 18409-18409/com.example.com.applicationstudent 
E/tag: loop number1
05-23 10:45:48.212 18409-18409/com.example.com.applicationstudent 
E/Tag: suv
05-23 10:45:48.212 18409-18409/com.example.com.applicationstudent 
E/tag: loop number2
05-23 10:45:48.212 18409-18409/com.example.com.applicationstudent 
E/Tag: suv

再次,我不想使用数据库,我想使用SharedPreferences

【问题讨论】:

  • 参考这个链接:-stackoverflow.com/a/5919074/3946958
  • String json = mPrefs.getString("details" + howMany, "");。那应该是String json = mPrefs.getString("details" + i, "");
  • 是的,我弄错了。非常感谢@greenapps

标签: android gson sharedpreferences android-sharedpreferences


【解决方案1】:

请尝试更正读取逻辑,

 for(int i=1;i<=howMany;i++) {
    String json = mPrefs.getString("details" + howMany, "");
    Student student = gson.fromJson(json, Student.class);
    Log.e("tag","loop number"+i);
    Log.e("Tag", student.getName());
}

在 mPrefs.getString 中使用“i”而不是“howMany”。由于“howMany”的值将在整个循环中保持不变,因此将获取相同的记录。

 for(int i=1;i<=howMany;i++) {
    String json = mPrefs.getString("details" + i, "");
    Student student = gson.fromJson(json, Student.class);
    Log.e("tag","loop number"+i);
    Log.e("Tag", student.getName());
}

【讨论】:

  • 哦,是的,我犯了一个新手错误。谢谢:)
【解决方案2】:

您可以使用 GSON 库轻松完成。

将数据保存到首选项

preferenceUtils.putStringPreferences(Constants.HISTORY_PREF, new Gson().toJson(historyList));

从首选项中检索数据

historyList = new Gson().fromJson(preferenceUtils.getStringPreferences(Constants.HISTORY_PREF),
            new TypeToken<List<History>>() {
            }.getType());

这里的historyList是一个'History'类型的列表

【讨论】:

  • 所以我们需要一个列表来做到这一点?为什么不列清单就不能工作?
  • 如果你想获取所有注册用户的列表,是的,你需要一个列表来做到这一点。
  • @Pranjal 你明白了吗?
  • 是的,谢谢。您的解决方案有效,但我犯了一个小逻辑错误,否则我的方法也是正确的
【解决方案3】:

您需要将 JSON 数组格式的数据保存到 SharedPreference 中。始终需要将以前存储的数据获取到 ArrayList 中,当您单击提交时,然后将其添加到 Array List 对象中,而不是在新对象中。 因此先前的值不受影响并保存在数组列表中的下一个计数器。并保存到相同的 SharedPreference 键值中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-05
    • 2022-01-21
    • 2011-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-25
    • 1970-01-01
    相关资源
    最近更新 更多