Уникальные данные не извлекаются при использовании SharedPreferences - PullRequest
0 голосов
/ 23 мая 2018

У меня есть Activity, на котором пользователи регистрируются, а на втором Activity, всем пользователям, которые зарегистрировались до сих пор, будет отображаться информация.

Я знаю, что это можно легко сделать, используябазы данных, но я хочу использовать SharedPreferences.Я использую Gson для хранения / извлечения данных.У меня есть класс Student с полями 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.

Ответы [ 3 ]

0 голосов
/ 23 мая 2018

Вы можете сделать это легко, используя библиотеку 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список типа «История»

0 голосов
/ 23 мая 2018

Пожалуйста, попробуйте исправить логику чтения,

 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());
}

используйте «i» в mPrefs.getString вместо «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());
}
0 голосов
/ 23 мая 2018

Вам необходимо сохранить данные в формате массива JSON в SharedPreference.Всегда нужно получить ранее сохраненные данные в ArrayList, а когда вы щелкнете по кнопке submit, добавьте объект в Array List, а не в новый объект.Таким образом, предыдущее значение не применяется и сохраняется на следующем счетчике в списке массивов.И сохраните в том же значении ключа SharedPreference.

...