Android SharedReference添加值无效

Android SharedReference添加值无效,android,arraylist,sharedpreferences,android-preferences,Android,Arraylist,Sharedpreferences,Android Preferences,有人能帮我找出以下问题吗。我有一个管理用户登录的类。当用户提供正确的用户名和密码时,我会从web服务获取他们的详细信息,web服务包含一个包含电话号码的字符串变量数组。课程安排如下 SessionManager.Class public class SessionManager { // Shared Preferences SharedPreferences pref; // Editor for Shared preferences Editor edito

有人能帮我找出以下问题吗。我有一个管理用户登录的类。当用户提供正确的用户名和密码时,我会从web服务获取他们的详细信息,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();


    }
我以前也面临同样的问题,因为我以前从SharedReference获得年龄。通过在
SessionManager
类中进行以下更改,我成功地使它工作

我更改了这行代码

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

editor.putInt(KEY_AGE, aUser.getAgeGroupID()); //returns expected value
我从key name中删除了引号,它成功了。我不知道如何让它在循环中工作。我已经一步一步地调试了代码,我注意到数组中的值确实在循环中添加,没有任何错误。我是不是遗漏了什么?任何帮助都将不胜感激。提前谢谢

更新这是我的用户实体类

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;
    }
}
公共类用户{
私有字符串全名;
私有int-genderID;
私有int-ageGroupID;
私人ArrayList联系人;
女性的私人布尔值;
公共用户(字符串名称、整数性别、整数年龄、,
ArrayList emergencyContacts,布尔值(参考){
全名=姓名;
genderID=性别;
ageGroupID=年龄;
联系人=紧急联系人;
ispreferfemal=isfemalprefered;
}
公共用户(){}
公共字符串getName(){
返回全名;
}
public int getGenderID(){
返回genderID;
}
public int getAgeGroupID(){
返回ageGroupID;
}
公共ArrayList getContacts(){
返回联系人;
}
公共布尔getConsultantReference(){
女性回归;
}
}
试试这种方法

   for(int i=0;i<aUser.getContacts().size();i++){
        editor.putString(KEY_CONTACT+(i+1), aUser.getContacts().get(i));
    }
更新:尝试以下方法:

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

for(int i=0;i当您尝试获取联系人1时,请删除

SessionManager sm=新的SessionManager(getApplicationContext())

并添加以下代码:

pref=\u context.getSharedReferences(pref\u名称,PRIVATE\u模式)

int i=pref.getInt(键年龄,0)

希望这能解决您的错误。

非常简单, 您的密钥变量名为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));
}

for(int i=0;ii)已在增加,因此为什么需要“KEY_CONTACT”+(i+1)替换为KEY_CONTACT”+imy键变量以“KEY_CONTACT1”开头,最初i=0,因此我添加+1以匹配变量aUser真的有联系人还是返回的列表为空?也尝试过了。它给出了一个“无法重新求解到变量”"错误谢谢更新。我想这就是我最初尝试的方式。通过这样做,当我尝试获取值时,它总是返回默认值null@n00b_c0der发布您的
用户aUser类
。该类中可能存在问题。它只是一个实体类。我在一个AsyncTask中实例化。我现在感觉自己像个白痴。感谢您指出这一点我希望我能给出两个正确的答案,因为另一个用户之前也提到了相同的答案。
for(int i=0;i<aUser.getContacts().size();i++){
        editor.putString("contact"+(i+1), aUser.getContacts().get(i));
    }
for(int i=0;i<aUser.getContacts().size();i++){
            editor.putString("contact"+(i+1), aUser.getContacts().get(i));
}