С Новым годом! Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
14 / 14 / 2
Регистрация: 07.11.2015
Сообщений: 237

В каких методах правильнее сохранять/загружать? SharedPreferences

10.01.2017, 21:05. Показов 1262. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток))) В моём приложении используется SharedPreferences для сохранения и загрузки данных.
В данный момент использую такую схему?
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    protected void onCreate(Bundle savedInstanceState) {
        Load_it();
    }
    protected void onStart(){
        super.onStart();
        Load_it();
    }
 
    protected void onStop(){
        super.onStop();
        Save_it();
    }
 
    protected void onPause(){
        super.onPause();
        Save_it();
    }
    protected void onResume(){
        super.onResume();
        Load_it();
    }
Однако, если приложение полностью закрыть, то есть выйти/свернуть и свайпом убрать, то ощущается потеря данных, то есть при N-запуске приложения я вижу данные по умолчанию, а не те, что сохранял: Стринг и Инт, а вот booleans = true, хотя по умолчанию ВЫСТАВЛЕНО (именно выставил ) false, а при загрузке (Load_it) defValue - false.
Так же в приложении есть кнопки, в функции которых входит запуск метода Save_it.
Сопсна... вопрос: Когда и где(в коде, в каких методах) правильнее будет сохранять значения и загружать их? Если я правильно понял жизненный цикл activity, то принцип у меня похож на правильный
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.01.2017, 21:05
Ответы с готовыми решениями:

В каких файлах у разных браузеров хранится галочка сохранять/не сохранять пароли?
Нужен способ отключить сохранение паролей во всех браузерах одновременно. Все известные обновляющиеся Chrome / Opera / Firefox / IE /...

Как сохранять и загружать cookie? [C++/Indy]
Ребята, помогите начинающему :) Я разобрался со всякими штучками, как там посылать get-post запросы и тд, все отлично. И теперь у меня...

Как Сохранять и Загружать класс в файл?
c# Есть класс. Внутри класса вложенные классы. В классах переменные, списки, массивы и.т.п. В них хранятся данные. Нужно весь класс с...

25
Модератор
 Аватар для vxg
3407 / 2178 / 354
Регистрация: 13.01.2012
Сообщений: 8,448
11.01.2017, 08:53
JerryLetehen, сохранять когда данные изменились, загружать при создании
0
3 / 3 / 2
Регистрация: 30.09.2014
Сообщений: 50
11.01.2017, 15:39
В жизненном цикле активити есть еще такой метод как onDestroy. Почитайте про него подробнее.
0
14 / 14 / 2
Регистрация: 07.11.2015
Сообщений: 237
11.01.2017, 15:45  [ТС]
spider1581, мою проблему он не решает.
0
Модератор
 Аватар для vxg
3407 / 2178 / 354
Регистрация: 13.01.2012
Сообщений: 8,448
11.01.2017, 15:46
JerryLetehen, чем не устраивает ответ во втором посте?
0
14 / 14 / 2
Регистрация: 07.11.2015
Сообщений: 237
11.01.2017, 15:58  [ТС]
vxg, данные изменились - сохранил. При полном закрытии приложения - загруженные данные не соответствуют сохранённым(частично).
Полное закрытие, в моём случае, это выход из приложения, и убрать свайпом.
Частично - потому что boolean значения остаются true, а Стринг и Инт уходят в null и 0 соответственно
0
3 / 3 / 2
Регистрация: 30.09.2014
Сообщений: 50
11.01.2017, 16:02
Выложите код методов сохранения и загрузки данных.
0
14 / 14 / 2
Регистрация: 07.11.2015
Сообщений: 237
11.01.2017, 16:13  [ТС]
spider1581, Вот:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
private void Save_it() {
        sharedPreferences = getPreferences(MODE_PRIVATE);
        editor = sharedPreferences.edit();
        editor.putInt(SAVED_HOUR_1, selected_hour_1);
        editor.putInt(SAVED_MINUTE_1, selected_minute_1);
        editor.putInt(SAVED_VOLUME_1, selected_volume_1);
        editor.putString(SAVED_TIME_TEXT_1, Name_Time_1);
        editor.putString(SAVED_VOLUME_TEXT_1, Name_Volume_1);
        editor.putBoolean(CHECK_IF_SET_TIME_1, checktime_1);
        editor.putBoolean(CHECK_IF_SET_VOLUME_1, checkvolume_1);
        editor.putBoolean(CHECK_IF_SET_1, checkset_1);
 
        editor.putInt(SAVED_HOUR_2, selected_hour_2);
        editor.putInt(SAVED_MINUTE_2, selected_minute_2);
        editor.putInt(SAVED_VOLUME_2, selected_volume_2);
        editor.putString(SAVED_TIME_TEXT_2, Name_Time_2);
        editor.putString(SAVED_VOLUME_TEXT_2, Name_Volume_2);
        editor.putBoolean(CHECK_IF_SET_TIME_2, checktime_2);
        editor.putBoolean(CHECK_IF_SET_VOLUME_2, checkvolume_2);
        editor.putBoolean(CHECK_IF_SET_2, checkset_2);
        editor.putBoolean(CHECK_IF_ENABLED_2, checkenabled_2);
        editor.apply();
    }
 
    private void Load_it() {
        sharedPreferences = getPreferences(MODE_PRIVATE);
        String Saved_Time_Text_1 = sharedPreferences.getString(SAVED_TIME_TEXT_1, Name_Time_1);
        set_time_1 = (TextView)findViewById(R.id.text_time_1);
        set_time_1.setText(Saved_Time_Text_1);
        String Saved_Volume_Text_1 = sharedPreferences.getString(SAVED_VOLUME_TEXT_1, Name_Volume_1);
        set_volume_1 = (TextView)findViewById(R.id.text_volume_1);
        set_volume_1.setText(Saved_Volume_Text_1);
        selected_hour_1 = sharedPreferences.getInt(SAVED_HOUR_1, 0);
        selected_minute_1 = sharedPreferences.getInt(SAVED_MINUTE_1, 0);
        selected_volume_1 = sharedPreferences.getInt(SAVED_VOLUME_1, 0);
        checktime_1 = sharedPreferences.getBoolean(CHECK_IF_SET_TIME_1, false);
        checkvolume_1 = sharedPreferences.getBoolean(CHECK_IF_SET_VOLUME_1, false);
        checkset_1 = sharedPreferences.getBoolean(CHECK_IF_SET_1, false);
 
        String Saved_Time_Text_2 = sharedPreferences.getString(SAVED_TIME_TEXT_2, Name_Time_2);
        set_time_2 = (TextView)findViewById(R.id.text_time_2);
        set_time_2.setText(Saved_Time_Text_2);
        String Saved_Volume_Text_2 = sharedPreferences.getString(SAVED_VOLUME_TEXT_2, Name_Volume_2);
        set_volume_2 = (TextView)findViewById(R.id.text_volume_2);
        set_volume_2.setText(Saved_Volume_Text_2);
        selected_hour_2 = sharedPreferences.getInt(SAVED_HOUR_2, 0);
        selected_minute_2 = sharedPreferences.getInt(SAVED_MINUTE_2, 0);
        selected_volume_2 = sharedPreferences.getInt(SAVED_VOLUME_2, 0);
        checktime_2 = sharedPreferences.getBoolean(CHECK_IF_SET_TIME_2, false);
        checkvolume_2 = sharedPreferences.getBoolean(CHECK_IF_SET_VOLUME_2, false);
        checkset_2 = sharedPreferences.getBoolean(CHECK_IF_SET_2, false);
        checkenabled_2 = sharedPreferences.getBoolean(CHECK_IF_ENABLED_2, false);
    }
0
2884 / 2296 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
11.01.2017, 16:30
Цитата Сообщение от JerryLetehen Посмотреть сообщение
editor.putString(SAVED_TIME_TEXT_1, Name_Time_1);
так и надо? там и должен быть Name_Time_1 ?
0
14 / 14 / 2
Регистрация: 07.11.2015
Сообщений: 237
11.01.2017, 16:42  [ТС]
Паблито,
Java
1
Name_Time_1 = set_time_1.getText().toString();
Да, так и надо

Добавлено через 1 минуту
Если конечно переменной Name_Time можно пренебречь...
0
3 / 3 / 2
Регистрация: 30.09.2014
Сообщений: 50
11.01.2017, 16:46
Вы сохраняете и загружаете данные методом Activity.getPreferences() без указания названия настроек. На сколько я знаю, в этом случае доступ к данным доступен только для той активити, которая с ним работает. А при закрытии приложения активити уничтожается...отсюда и получается, что вы получаете какие-то не те данные. Может я что-то путаю... Попробуйте указать явное имя ваших настроек:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
private SharedPreferences mySettings;
 
@Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mySettings = getSharedPreferences("mysettings", Context.MODE_PRIVATE);
        Load_it();
        .....
}
/*Other overrided methods*/
 
private void Save_it() {     
        Editor editor = mySettings.edit();
        editor.putString("myStingName", "myStringValue" );
        .....
        editor.apply();
}
private void Load_it() {
        String str ="";
        if(mySettings.contains("myStringName")) {
              str = (String)mySettings.getString("myStringName", "");
        }     
        .....
}
Примерно так. Отпишитесь, если поможет.
0
14 / 14 / 2
Регистрация: 07.11.2015
Сообщений: 237
11.01.2017, 16:47  [ТС]
Цитата Сообщение от spider1581 Посмотреть сообщение
доступен только для той активити, которая с ним работает
В приложении лишь одно Activity. Щас попробую ваш вариант.
0
2884 / 2296 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
11.01.2017, 16:58
Цитата Сообщение от JerryLetehen Посмотреть сообщение
Name_Time_1 = set_time_1.getText().toString();
ну и где эта строка? ее нет в том куске кода...может она вообще не выполняется перед вызовом сохранения настроек
0
14 / 14 / 2
Регистрация: 07.11.2015
Сообщений: 237
11.01.2017, 17:05  [ТС]
Цитата Сообщение от Паблито Посмотреть сообщение
может она вообще не выполняется перед вызовом сохранения настроек
В активите есть кнопка, которая и выполняет эту строку. Даже если эта строка не будет выполнена - у меня на этот случай есть специальный код, где если Name_Time == null - делать ... что-то

Добавлено через 4 минуты
spider1581,
Java
1
2
3
4
5
String str ="";
        if(mySettings.contains("myStringName")) {
              str = (String)mySettings.getString("myStringName", "");
        }     
        .....
вот эту часть кода не много не понял... мне так делать?:
Java
1
2
3
4
5
6
String Saved_Time_Text_1 = "";
        if(mySettings.contains("SAVED_TIME_TEXT_1")) {
            Saved_Time_Text_1 = mySettings.getString("SAVED_TIME_TEXT_1", Name_Time_1);
            set_time_1 = (TextView)findViewById(R.id.text_time_1);
            set_time_1.setText(Saved_Time_Text_1);
        }
0
3 / 3 / 2
Регистрация: 30.09.2014
Сообщений: 50
11.01.2017, 17:17
Эта часть кода для того, чтобы исключить обращения к несуществующим полям, иначе будут записаны данные по-умолчанию...например при первом запуске приложения, когда ваши настройки еще не созданы, а метод Load_it() упорно пытается выудить данные. В принципе, можете убрать эту проверку, если для вас не критично.
Java
1
set_time_1 = (TextView)findViewById(R.id.text_time_1);
Вот это лучше делать в методе onCreate один раз...зачем находить все вьюхи раз за разом?
Java
1
Saved_Time_Text_1 = mySettings.getString("SAVED_TIME_TEXT_1", Name_Time_1);
На месте Name_Time_1 должно быть значение по-умолчанию, т.е. то, что будет записано в Saved_Time_Text_1, если не существует настройки с именем SAVED_TIME_TEXT_1.
0
14 / 14 / 2
Регистрация: 07.11.2015
Сообщений: 237
11.01.2017, 17:19  [ТС]
Цитата Сообщение от spider1581 Посмотреть сообщение
должно быть значение по-умолчанию
Ну пусть и стоит, если у меня оно не менялось, значит null, а значит сработает нужная мне проверка.
Цитата Сообщение от spider1581 Посмотреть сообщение
зачем находить все вьюхи раз за разом?
Шобы наверняка)))
0
3 / 3 / 2
Регистрация: 30.09.2014
Сообщений: 50
11.01.2017, 17:25
JerryLetehen, этим вы замедляете себе программу. Пока кода мало это не критично, но вы же не будете всегда писать маленькие программы. Учитесь делать сразу правильно.
0
14 / 14 / 2
Регистрация: 07.11.2015
Сообщений: 237
11.01.2017, 17:37  [ТС]
spider1581, Уже убрал

Добавлено через 8 минут
Паблито, spider1581, Имею такой код:
Load & Save
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
private void Save_it() {
        sharedPreferences = getPreferences(MODE_PRIVATE);
        editor = mySettings.edit();
        editor = sharedPreferences.edit();
        editor.putInt(SAVED_HOUR_1, selected_hour_1);
        editor.putInt(SAVED_MINUTE_1, selected_minute_1);
        editor.putInt(SAVED_VOLUME_1, selected_volume_1);
        editor.putString(SAVED_TIME_TEXT_1, Name_Time_1);
        editor.putString(SAVED_VOLUME_TEXT_1, Name_Volume_1);
        editor.putBoolean(CHECK_IF_SET_TIME_1, checktime_1);
        editor.putBoolean(CHECK_IF_SET_VOLUME_1, checkvolume_1);
        editor.putBoolean(CHECK_IF_SET_1, checkset_1);
 
        editor.putInt(SAVED_HOUR_2, selected_hour_2);
        editor.putInt(SAVED_MINUTE_2, selected_minute_2);
        editor.putInt(SAVED_VOLUME_2, selected_volume_2);
        editor.putString(SAVED_TIME_TEXT_2, Name_Time_2);
        editor.putString(SAVED_VOLUME_TEXT_2, Name_Volume_2);
        editor.putBoolean(CHECK_IF_SET_TIME_2, checktime_2);
        editor.putBoolean(CHECK_IF_SET_VOLUME_2, checkvolume_2);
        editor.putBoolean(CHECK_IF_SET_2, checkset_2);
        editor.putBoolean(CHECK_IF_ENABLED_2, checkenabled_2);
        editor.apply();
    }
 
    private void Load_it() {
        sharedPreferences = getPreferences(MODE_PRIVATE);
        String Saved_Time_Text_1 = sharedPreferences.getString(SAVED_TIME_TEXT_1, Name_Time_1);
        set_time_1.setText(Saved_Time_Text_1);
        String Saved_Volume_Text_1 = sharedPreferences.getString(SAVED_VOLUME_TEXT_1, Name_Volume_1);
        set_volume_1.setText(Saved_Volume_Text_1);
        selected_hour_1 = sharedPreferences.getInt(SAVED_HOUR_1, 0);
        selected_minute_1 = sharedPreferences.getInt(SAVED_MINUTE_1, 0);
        selected_volume_1 = sharedPreferences.getInt(SAVED_VOLUME_1, 0);
        checktime_1 = sharedPreferences.getBoolean(CHECK_IF_SET_TIME_1, false);
        checkvolume_1 = sharedPreferences.getBoolean(CHECK_IF_SET_VOLUME_1, false);
        checkset_1 = sharedPreferences.getBoolean(CHECK_IF_SET_1, false);
 
        String Saved_Time_Text_2 = sharedPreferences.getString(SAVED_TIME_TEXT_2, Name_Time_2);
        set_time_2.setText(Saved_Time_Text_2);
        String Saved_Volume_Text_2 = sharedPreferences.getString(SAVED_VOLUME_TEXT_2, Name_Volume_2);
        set_volume_2.setText(Saved_Volume_Text_2);
        selected_hour_2 = sharedPreferences.getInt(SAVED_HOUR_2, 0);
        selected_minute_2 = sharedPreferences.getInt(SAVED_MINUTE_2, 0);
        selected_volume_2 = sharedPreferences.getInt(SAVED_VOLUME_2, 0);
        checktime_2 = sharedPreferences.getBoolean(CHECK_IF_SET_TIME_2, false);
        checkvolume_2 = sharedPreferences.getBoolean(CHECK_IF_SET_VOLUME_2, false);
        checkset_2 = sharedPreferences.getBoolean(CHECK_IF_SET_2, false);
        checkenabled_2 = sharedPreferences.getBoolean(CHECK_IF_ENABLED_2, false);
    }

& auto
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
protected void onStart(){
        super.onStart();
        Load_it();
    }
 
    protected void onStop(){
        super.onStop();
        Save_it();
    }
 
    protected void onPause(){
        super.onPause();
        Save_it();
    }
 
    protected void onDestroy(){
        super.onDestroy();
        Save_it();
    }
 
    protected void onResume(){
        super.onResume();
        Load_it();
    }

При третьем запуске приложения данные не корректны
0
3 / 3 / 2
Регистрация: 30.09.2014
Сообщений: 50
11.01.2017, 17:56
JerryLetehen, так вы там ничего не поменяли...я же вам пример скинул.
0
14 / 14 / 2
Регистрация: 07.11.2015
Сообщений: 237
11.01.2017, 18:01  [ТС]
spider1581, В onCreate:
Java
1
2
mySettings = getSharedPreferences("mysettings", Context.MODE_PRIVATE);
        Load_it();
В Save_it:
Java
1
2
3
4
sharedPreferences = getPreferences(MODE_PRIVATE);
        editor = mySettings.edit();
        editor = sharedPreferences.edit();
        .....
А что писать в Load, я не понял:
Java
1
2
3
4
5
6
String Saved_Time_Text_1 = "";
        if(mySettings.contains("SAVED_TIME_TEXT_1")) {
            Saved_Time_Text_1 = mySettings.getString("SAVED_TIME_TEXT_1", Name_Time_1);
            set_time_1 = (TextView)findViewById(R.id.text_time_1);
            set_time_1.setText(Saved_Time_Text_1);
        }
Так прописать для каждой, нужной мне переменной, правильно понимаю?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.01.2017, 18:01
Помогаю со студенческими работами здесь

Как сохранять/загружать на VBA Excel?
помогите кто может!!!!!!!! мне нужно сделать форму а на ней кнопки загрузить и сохранить, а к кнопкам соответственно прикрепить...

Проводник не дает сохранять и загружать файлы
Когда пытаешься открыть через программу файл, без разницы фотошоп, пэйнт, или в джумле выбираю файл для загрузки (в 4 браузерах пробовал)...

Как загружать картинки в папку и сохранять название в бд?
Подскажите кто делал такое или дайте ссылку на туториал пожалуйста. Как загрузить картинку через диалог выбора файла и сохранить имя в бд,...

В каких методах компилятор сгенерирует ошибки компиляции?
помогите, В каких методах компилятор сгенерирует ошибки компиляции Буду рад объясненению, сам думаю M2, но не уверен

Как сохранять и загружать типизированные файлы с пом. TStream-ов?
Есть тип TMyType = record name, forname: string end; Обычно записываю и считываю из файлов процедурными путями var f: file of...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru