【问题标题】:SharedPreference adding values not workingSharedPreference 添加值不起作用
【发布时间】:2014-05-07 05:54:08
【问题描述】:

谁能帮我确定以下问题。我有一个管理用户登录的类。当用户提供正确的用户名和密码时,我会从 Web 服务中获取他们的详细信息,其中包括包含电话号码的字符串变量数组。类如下

SessionManager.Class

public class SessionManager {
    // Shared Preferences
    SharedPreferences pref;

    // Editor for Shared preferences
    Editor editor;

    // Context
    Context _context;

    // Shared pref mode
    int PRIVATE_MODE = 0;

    // Sharedpref file name
    private static final String PREF_NAME = "LoginPref";

    // All Shared Preferences Keys
    private static final String IS_LOGIN = "IsLoggedIn";

    public static final String KEY_EMAIL = "email";

    public static final String KEY_GENDER = "gender";

    public static final String KEY_AGE = "age";

    public static final String KEY_CONSULTANT = "consultant";

    public static final String KEY_CONTACT1 = "contact1";

    public static final String KEY_CONTACT2 = "contact2";

    public static final String KEY_CONTACT3 = "contact3";

    public static final String KEY_CONTACT4 = "contact4";

    public static final String KEY_CONTACT5 = "contact5";

    public static final String KEY_CONTACT_SIZE = "contactsize";

    public static final String KEY_NAME = "userfullname";

    // Constructor
    public SessionManager(Context context) {
        this._context = context;
        pref = _context.getSharedPreferences(PREF_NAME, PRIVATE_MODE);
        editor = pref.edit();
    }

    public void createLoginSession(String email, User aUser) {

        editor.putBoolean(IS_LOGIN, true);

        editor.putString(KEY_EMAIL, email);
        editor.putBoolean(KEY_CONSULTANT, aUser.getConsultantPreference());
        editor.putString(KEY_NAME, aUser.getName());
        editor.putInt(KEY_AGE, aUser.getAgeGroupID());
        editor.putInt(KEY_GENDER, aUser.getGenderID());
        editor.putInt(KEY_CONTACT_SIZE, aUser.getContacts().size());

//loop through arraylist and add values
        for(int i=0;i<aUser.getContacts().size();i++){
            editor.putString("KEY_CONTACT"+(i+1), aUser.getContacts().get(i));
        }

        editor.commit();
    }

// returns contact number 1
    public String getContact1() {

        return pref.getString(KEY_CONTACT1, null);
    }


//returns age
    public int getAge() {

        return pref.getInt(KEY_AGE, 0);
    }

    public void logoutUser(){
        // Clearing all data from Shared Preferences
        editor.clear();
        editor.commit();


    }

在活动类中当我尝试像下面那样获取 Contact1 时,我总是得到 null,但对于其他值(年龄、性别等)它正在工作。

SessionManager sm = new SessionManager(getApplicationContext());
int ageGroup = sm.getAge(); // returns expected value
        String contact1 = sm.getContact1(); //contact1 is always null

我之前从 sharedpreference 中获取年龄时遇到了同样的问题。我通过在SessionManager 类中进行以下更改来管理它以使其工作

我改了这行代码

editor.putInt("KEY_AGE", aUser.getAgeGroupID()); //used to return 0 the default value

到这里

editor.putInt(KEY_AGE, aUser.getAgeGroupID()); //returns expected value

我从键名中删除了引号,它起作用了。我不知道如何使它在循环内工作。我已经逐步调试了代​​码,我注意到数组中的值确实被添加,循环内没有任何错误。我在这里错过了什么吗?任何帮助,将不胜感激。提前致谢。

更新这是我的用户实体类

public class User {
    private String fullName;
    private int genderID;
    private int ageGroupID;
    private ArrayList<String> contacts;
    private boolean isPreferFemale;

    public User(String name, int gender, int age,
            ArrayList<String> emergencyContacts, boolean isFemalpreferred) {
        fullName = name;
        genderID = gender;
        ageGroupID = age;
        contacts = emergencyContacts;
        isPreferFemale = isFemalpreferred;
    }

    public User(){}

    public String getName(){
        return fullName;
    }

    public int getGenderID(){
        return genderID;
    }

    public int getAgeGroupID(){
        return ageGroupID;
    }

    public ArrayList<String> getContacts(){
        return contacts;
    }

    public boolean getConsultantPreference(){
        return isPreferFemale;
    }
}

【问题讨论】:

  • i 已经在增加,所以为什么你需要 "KEY_CONTACT"+(i+1) 替换为 KEY_CONTACT"+i
  • 我的关键变量以“KEY_CONTACT1”开头,最初 i = 0 所以我添加 +1 以将其与变量匹配
  • 用户是否真的有联系人或者返回的列表是空的?

标签: android arraylist sharedpreferences android-preferences


【解决方案1】:

试试这个方法

   for(int i=0;i<aUser.getContacts().size();i++){
        editor.putString(KEY_CONTACT+(i+1), aUser.getContacts().get(i));
    }

将""从preference中去掉,直接提供preference名字

editor.putString("KEY_CONTACT"+(i+1), aUser.getContacts().get(i)); //remove "" from "KEY_CONTACT" and directly provide preference name like KEY_CONTACT

更新:试试这个方法:

for(int i=0;i<aUser.getContacts().size();i++){
        editor.putString("contact"+(i+1), aUser.getContacts().get(i));
    }

【讨论】:

  • 也试过了。它给出了“无法解析为变量”错误
  • 感谢您的更新。我认为这就是我最初尝试的方式。通过这样做,当我尝试获取该值时,它总是返回默认的 null
  • @n00b_c0der 发布您的User aUser class。可能是那个班级的问题
  • 完成。它只是一个实体类。我在 AsyncTask 中被实例化
【解决方案2】:

很简单, 您的关键变量名称是 KEY_CONTACT1,其值为 contact1

所以当你向 pref 添加值时,你使用 KEY_CONTACT1 作为键名,这是错误的

在for循环中改成这个

for(int i=0;i<aUser.getContacts().size();i++){
            editor.putString("contact"+(i+1), aUser.getContacts().get(i));
}

【讨论】:

  • 我现在感觉自己像个白痴。感谢您指出了这一点。我希望我能给出两个正确的答案,因为另一位用户之前也提到过相同的答案。
【解决方案3】:

当您尝试获取 Contact1 时,删除

SessionManager sm = new SessionManager(getApplicationContext());

并添加以下代码:

pref = _context.getSharedPreferences(PREF_NAME, PRIVATE_MODE);

int i = pref.getInt(KEY_AGE, 0);

希望这能解决您的错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-24
    • 2020-06-20
    • 1970-01-01
    • 2014-09-14
    • 2012-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多