Страница 1 из 11

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

Добавлено: 14 ноя 2011, 03:00
damager82
В этом уроке:

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

Click here to read this article!

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

Добавлено: 28 янв 2012, 10:50
zavbak
Добрый день!

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

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

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

Поставил Load()

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

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

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

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

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

Добавлено: 11 фев 2012, 23:55
btx
а метод 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

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

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

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

Добавлено: 03 мар 2012, 12:00
zavbak
Спасибо большее

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

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

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

Добавлено: 06 май 2012, 15:01
KamiSempai
Для этого есть javax.crypto.

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

Добавлено: 02 июн 2012, 13:39
romanzi
Как удалить данные из ключа?

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

Добавлено: 04 июн 2012, 10:43
damager82
romanzi писал(а):Как удалить данные из ключа?
Подробнизируйте вопрос. Не оч понятно

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

Добавлено: 13 июл 2012, 21:08
daiz123
final String SAVED_TEXT = "saved_text";
final в этой строке означает что переменная глобальна?
в чём разница между этой строкой и такой же но без final?

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

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

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

Добавлено: 19 июл 2012, 19:31
math64

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

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

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

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

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

static final boolean USE_DB = false;

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

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

Добавлено: 19 июл 2012, 19:43
math64
Оказывается, можно сохранять 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)
Пока не пробовал

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

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

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

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

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

Добавлено: 20 июл 2012, 13:13
KamiSempai
Ошибка возникает в другом месте. Посмотрите в логах на какой строке это происходит.

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

Добавлено: 20 июл 2012, 13:49
xa4a4a
Спасибо за оперативный ответ:)
Разобрался.

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

Добавлено: 14 авг 2012, 21:26
3Gern
вместо текста хочу сохранить значения массива (в массиве хранятся результаты), сохраняю вот так

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

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

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

Добавлено: 15 авг 2012, 00:02
rezak90
3Gern лучше кинь код, а то какой то велосипед ты описал.

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

Добавлено: 15 авг 2012, 10:32
3Gern
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