Урок 33. Хранение данных. Preferences.

Обсуждение уроков
Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Урок 33. Хранение данных. Preferences.

Сообщение damager82 » 14 ноя 2011, 03:00

В этом уроке:

- хранение данных с помощью Preferences

Click here to read this article!
Последний раз редактировалось damager82 01 май 2017, 16:38, всего редактировалось 5 раз.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

zavbak
Сообщения: 6
Зарегистрирован: 25 янв 2012, 02:25

Re: Урок 33. Хранение данных. Preferences.

Сообщение zavbak » 28 янв 2012, 10:50

Добрый день!

У меня есть две Activity.
Одна Рабочая, одна Настройки

Из Рабочей с помощью меню, захожу в Настройки.
Меняю, сохраняю, выхожу назад в Рабочую.

В моменты Рабочей onCreate, onStart(), onRestart()

Поставил Load()

Но настройки в этот момент еще не сохранились (Preferences старый - видимо еще не записался файл).

Как поступать? Писать задержку или есть какие то другие подходы?

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Урок 33. Хранение данных. Preferences.

Сообщение damager82 » 28 янв 2012, 23:37

zavbak писал(а): Но настройки в этот момент еще не сохранились (Preferences старый - видимо еще не записался файл).
Там все пишется в том же процессе. Должен сначала записать, потом продолжить работу.
Выложите здесь код сохранения и чтения. Может в них что не так?
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Аватара пользователя
btx
Сообщения: 4
Зарегистрирован: 31 янв 2012, 18:00

Re: Урок 33. Хранение данных. Preferences.

Сообщение btx » 11 фев 2012, 23:55

а метод saveText - в onDestroy
Это не удачное решение, данные следует сохранять в onPause, так как onPause будет обязательно вызван в приложении, а onDestroy не всегда, таким образом можно попросту потерять данные.
Because onPause() is the first of the three, once the activity is created, onPause() is the last method that's guaranteed to be called before the process can be killed—if the system must recover memory in an emergency, then onStop() and onDestroy() might not be called. Therefore, you should use onPause() to write crucial persistent data (such as user edits) to storage. However, you should be selective about what information must be retained during onPause(), because any blocking procedures in this method block the transition to the next activity and slow the user experience.

Methods that are marked "No" in the Killable column protect the process hosting the activity from being killed from the moment they are called. Thus, an activity is killable from the time onPause() returns to the time onResume() is called. It will not again be killable until onPause() is again called and returns.

http://developer.android.com/guide/topi ... ities.html

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Урок 33. Хранение данных. Preferences.

Сообщение damager82 » 12 фев 2012, 10:54

btx писал(а): Это не удачное решение, данные следует сохранять в onPause, так как onPause будет обязательно вызван в приложении, а onDestroy не всегда, таким образом можно попросту потерять данные.
Да, имеет смысл в уроке уточнить, что я использую onDestroy только для примера.
Спасибо!
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

zavbak
Сообщения: 6
Зарегистрирован: 25 янв 2012, 02:25

Re: Урок 33. Хранение данных. Preferences.

Сообщение zavbak » 03 мар 2012, 12:00

Спасибо большее

Аватара пользователя
goodroot
Сообщения: 13
Зарегистрирован: 05 май 2012, 10:42
Откуда: Бобруйск

Re: Урок 33. Хранение данных. Preferences.

Сообщение goodroot » 06 май 2012, 12:15

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

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Урок 33. Хранение данных. Preferences.

Сообщение KamiSempai » 06 май 2012, 15:01

Для этого есть javax.crypto.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

romanzi
Сообщения: 8
Зарегистрирован: 31 май 2012, 21:55

Re: Урок 33. Хранение данных. Preferences.

Сообщение romanzi » 02 июн 2012, 13:39

Как удалить данные из ключа?

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Урок 33. Хранение данных. Preferences.

Сообщение damager82 » 04 июн 2012, 10:43

romanzi писал(а):Как удалить данные из ключа?
Подробнизируйте вопрос. Не оч понятно
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

daiz123
Сообщения: 18
Зарегистрирован: 11 июн 2012, 15:42

Re: Урок 33. Хранение данных. Preferences.

Сообщение daiz123 » 13 июл 2012, 21:08

final String SAVED_TEXT = "saved_text";
final в этой строке означает что переменная глобальна?
в чём разница между этой строкой и такой же но без final?

AndreyI
Сообщения: 372
Зарегистрирован: 14 май 2012, 16:18

Re: Урок 33. Хранение данных. Preferences.

Сообщение AndreyI » 16 июл 2012, 11:32

daiz123 писал(а):final String SAVED_TEXT = "saved_text";
final в этой строке означает что переменная глобальна?
в чём разница между этой строкой и такой же но без final?
Это означает, что строка является константой и изменить её в процессе выполнения кода невозможно. В большинстве случаев её значение связывается (или даже подставляется) уже на этапе компиляции при формировании байт-кода виртуальной машины, т.е. осуществляет раннее связывание, что ускоряет работу с ней.

math64
Сообщения: 235
Зарегистрирован: 16 июл 2012, 07:47

Re: Урок 33. Хранение данных. Preferences.

Сообщение math64 » 19 июл 2012, 19:31

Код: Выделить всё

final String SAVED_TEXT = "saved_text";
final означает, что изменить значение переменной можно только в конструкторе (это присваивание будет вставлено в начало любого конструктора)
лучше

Код: Выделить всё

static final String SAVED_TEXT = "saved_text";
Присваивание значаения произойдёт при загрузке класса и больше не изменится. Компилятор будет использовать константу вместо загрузки переменной.

Код: Выделить всё

static final boolean USE_DB = false;

if(USE_DB) {
// работа с базой данных
} else {
// работа без базой данных
}
Компилятор оставит только один вариант, но выдаст предупреждение - мёртвый код

math64
Сообщения: 235
Зарегистрирован: 16 июл 2012, 07:47

Re: Урок 33. Хранение данных. Preferences.

Сообщение math64 » 19 июл 2012, 19:43

Оказывается, можно сохранять Preference так:

Код: Выделить всё

<PreferenceScreen
  xmlns:android="http://schemas.android.com/apk/res/android">
  <CheckBoxPreference
    android:key="checkbox"
    android:title="Checkbox Preference"
    android:summary="Check it on, check it off" />
  <RingtonePreference
    android:key="ringtone"
    android:title="Ringtone Preference"
    android:showDefault="true"
    android:showSilent="true"
    android:summary="Pick a tone, any tone" />
</PreferenceScreen>

Код: Выделить всё

public class EditPreferences extends PreferenceActivity {
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    addPreferencesFromResource(R.xml.preferences);
  }
}
(Mark L. Murphy, Beginning Android 2)
Пока не пробовал

xa4a4a
Сообщения: 8
Зарегистрирован: 20 июл 2012, 12:39

Re: Урок 33. Хранение данных. Preferences.

Сообщение xa4a4a » 20 июл 2012, 12:54

Доброго времени суток.
При отсутствии сохраненных Preferences, метод .getAll должен выбрасывать NullPointerException.
При оборачивании в try/catch

SharedPreferences sPref = getPreferences(MODE_PRIVATE);
try {
sPref.getAll();
} catch (NullPointerException e) {
Log.e("getAll", "Error");
}

приложение все равно падает. Подскажите в чем проблема.

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Урок 33. Хранение данных. Preferences.

Сообщение KamiSempai » 20 июл 2012, 13:13

Ошибка возникает в другом месте. Посмотрите в логах на какой строке это происходит.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

xa4a4a
Сообщения: 8
Зарегистрирован: 20 июл 2012, 12:39

Re: Урок 33. Хранение данных. Preferences.

Сообщение xa4a4a » 20 июл 2012, 13:49

Спасибо за оперативный ответ:)
Разобрался.

3Gern
Сообщения: 25
Зарегистрирован: 30 июл 2012, 13:32

Re: Урок 33. Хранение данных. Preferences.

Сообщение 3Gern » 14 авг 2012, 21:26

вместо текста хочу сохранить значения массива (в массиве хранятся результаты), сохраняю вот так

Код: Выделить всё

ed.putString(Save_Array, Arrays.toString(mas));
а как теперь ее загрузить? что в дальнейшим работать с результатами, я делал вот так: убрал добавившиеся символы с помощью substring (это запятые и прямоугольные скобки), затем создал строковый массив туда положил отредактированную строку с помощью split, и все что я сделал пошло на коту под хвост, обратно добавились прямоугольники, запятые и я в тупике не знаю что делать (( может не правильно сохраняю массив? помогите, дайте совет.

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 33. Хранение данных. Preferences.

Сообщение rezak90 » 15 авг 2012, 00:02

3Gern лучше кинь код, а то какой то велосипед ты описал.
R.id.team
Политика на форуме запрещена

3Gern
Сообщения: 25
Зарегистрирован: 30 июл 2012, 13:32

Re: Урок 33. Хранение данных. Preferences.

Сообщение 3Gern » 15 авг 2012, 10:32

rezak90 писал(а):3Gern лучше кинь код, а то какой то велосипед ты описал.
ну код такой же как в примере

Код: Выделить всё

void saveArray(){
	sPref = getPreferences(MODE_PRIVATE);
	Editor ed = sPref.edit();
	ed.putString(Save_Array, Arrays.toString(mas));
	ed.commit();
        }

void loadArray() {
           sPref = getPreferences(MODE_PRIVATE);
	   String base = sPref.getString(Save_Array, "");
           //дальше нужно содержимое Save_Array обратно вогнать в mas

Ответить