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

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

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

Сообщение damager82 » 12 дек 2012, 10:10

djdance писал(а):в итоге q всегда пустая, пока не перезапущу всё с нуля.
"проверка" высвечивает успешно.
почему так? поток виноват?

UPDATE действительно поток. объявлять надо внутри потока. Почему никто не сказал! :D
В смысле?! Если переносите объявление SharedPreferences prefs в поток, то начинает работать?
А сервисы у вас в одном процессе крутятся или разных? У меня такой баг был, когда сервис и приложение в разных процессах находились.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

djdance
Сообщения: 48
Зарегистрирован: 04 дек 2012, 15:33

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

Сообщение djdance » 12 дек 2012, 17:10

> Если переносите объявление SharedPreferences prefs в поток, то начинает работать?
так точно. Теперь в активити видится то что заносим в сервисе.

Сервис тоже поточный, в манифесте:
android:process=":newprocIntentSend"

Кстати, не знаю, такой двойной поток в потоке это ок или не ок.

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

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

Сообщение damager82 » 14 дек 2012, 12:21

djdance писал(а):> Если переносите объявление SharedPreferences prefs в поток, то начинает работать?
так точно. Теперь в активити видится то что заносим в сервисе.

Сервис тоже поточный, в манифесте:
android:process=":newprocIntentSend"

Кстати, не знаю, такой двойной поток в потоке это ок или не ок.
Процесс и поток - это совсем разные вещи, http://seregaborzov.wordpress.com/2006/ ... ot_potoka/
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

djdance
Сообщения: 48
Зарегистрирован: 04 дек 2012, 15:33

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

Сообщение djdance » 14 дек 2012, 12:40

damager82,

прочитал, понял. Процесс - это контейнер, сравнивать его с потоком некорректно. А в чём уж тогда выгода указывать имя процесса в манифесте, проясните?

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

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

Сообщение damager82 » 18 дек 2012, 09:47

djdance писал(а):А в чём уж тогда выгода указывать имя процесса в манифесте, проясните?
Хороший вопрос. Я пока на практике не встречал острой необходимости в этом атрибуте.

Как пример, посмотрите Урок 99. Там сервис выполняет тяжелые задачи и выделен в отдельный процесс, чтобы не тормозить UI приложения. Хотя, это же можно было сделать и в отдельном потоке одного процесса.

В хелпе пишут, что можно для компонентов разных приложений указать один процесс и они будут запущены в нем, уменьшая тем самым использование ресурсов системы.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

nemony
Сообщения: 4
Зарегистрирован: 14 июн 2012, 16:58

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

Сообщение nemony » 21 дек 2012, 12:29

"Отобразилась файловая система эмулятора. Открываем data/data/ru.startandroid.develop.p0331sharedpreferences/shared_prefs и видим там файл MainActivity.xml. Если его выгрузить на комп и открыть - увидим следующее:"


не подскажете как "его" выгрузить на комп??

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

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

Сообщение damager82 » 24 дек 2012, 14:28

nemony писал(а):"Отобразилась файловая система эмулятора. Открываем data/data/ru.startandroid.develop.p0331sharedpreferences/shared_prefs и видим там файл MainActivity.xml. Если его выгрузить на комп и открыть - увидим следующее:"
не подскажете как "его" выгрузить на комп??
На вкладке FileExplorer есть пара кнопок рядом. Одна кидает файл на девайс, другое - с девайса
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

denisneposeda
Сообщения: 19
Зарегистрирован: 30 дек 2012, 10:43

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

Сообщение denisneposeda » 05 янв 2013, 12:41

1) Возможно сразу занести в приложение Prefences? т.е. как ресурсы, прописать и все, только их потом брать?
2) Есть элемент AutoCompleteTextView, можно ли к нему подключить Prefences?

$01ny$hko
Сообщения: 44
Зарегистрирован: 18 окт 2012, 10:11

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

Сообщение $01ny$hko » 18 янв 2013, 22:02

Добрый всем вечер! Помогите, пожалуйста, разобраться в этой теме - совсем запуталась ((. Буду рассказывать по пунктам что и как я поняла, чтобы ещё и вас не запутать :lol:
1. getPreferences использую если данные будут сохраняться и применяться только в одной Activity, getSharedPreferences - если буду сохранять в данной Activity, а использовать из разных в рамках своего приложения.
Отсюда вопрос 1. - - при использовании getSharedPreferences в каких случаях создаются разные объекты и файлы?
2. вот этой строке объявляю объект класса, тут я могу его назвать как захочу.

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

SharedPreferences sPref;
3. Вот в этой строке

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

 sPref = getPreferences(MODE_PRIVATE);
- получаю тот самый объект от класса,
4. а если вот так

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

sPref = getSharedPreferences("MyPref", MODE_PRIVATE);
- то ещё и говорю как будет называться файл, в котором данные сохранятся.
5. здесь объявляется строка

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

final String SAVED_TEXT = "saved_text";
и отсюда же и начинается каша!!!
2 вопрос. почему final?
3 вопрос. String всегда пишется или есть другие варианты? Если да, то какие и когда применяются?
4 вопрос. SAVED_TEXT - наименование переменной, что здесь можно писать и где ещё это наименование используется в дальнейшем?
5 вопрос. "saved_text" - значение, это просто название как в паре ключ-значение?
6.
saveText – сохранение данных.
этот метод для сохранения данных. Для автоматического сохранения при закрытии приложения правильнее всего писать в

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

@Override   protected void onPause() {     saveText();     super.onPause();   }
7. используется для загрузки данных. И если нужно чтобы при открытии она происходила автоматически то вызываем его в onCreate.

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

 loadText();
6. вопрос а если не надо отображать данные на экране, то тогда где вызывать?
8. Здесь непосредственно говоришь откуда и что и куда сохранять.

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

 void saveText() {
    sPref = getPreferences(MODE_PRIVATE);
    Editor ed = sPref.edit();
    ed.putString(SAVED_TEXT, etText.getText().toString());
    ed.commit();
    Toast.makeText(this, "Text saved", Toast.LENGTH_SHORT).show();
  }
7 вопрос. если мне нужно сохранять данные, полученные из запроса, к примеру, то что писать в следующем отрывке?

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

private synchronized void parsingDataInView(JSONArray jsonArray) { (jsonArray.getJSONObject(0).has("place")) {
				JSONObject jsonObject = jsonArray.getJSONObject(0);
Вариант А. полностью предыдущий код.
Вариант Б. только saveText(); , но он же пишется в onPause :? !!!
Вариант В. как-то иначе... :?:
Ну и собственно тоже самое и с loadText();

P.S. Код уже написала, он даже работает, но это всё скорее на интуитивном уровне, а хотелось бы понять как правильно, так что буду благодарна если кто-то всё-таки сможет объяснить что к чему!

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

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

Сообщение rezak90 » 18 янв 2013, 23:36

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

$01ny$hko
Сообщения: 44
Зарегистрирован: 18 окт 2012, 10:11

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

Сообщение $01ny$hko » 19 янв 2013, 11:03

:lol: аха-ха!!! Вы всё ещё пьёте?? Тогда мы идём к Вам!!!

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

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

Сообщение rezak90 » 19 янв 2013, 15:03

Ну что же, я проснулся и готов отвечать:
1. getPreferences использую если данные будут сохраняться и применяться только в одной Activity, getSharedPreferences - если буду сохранять в данной Activity, а использовать из разных в рамках своего приложения.
Отсюда вопрос 1. - - при использовании getSharedPreferences в каких случаях создаются разные объекты и файлы?
вопрос что то не совсем понятен но метод getSharedPreferences это метод контекста, контекст один в приложении, у этого метода есть два параметра: имя файла и флаг который указывает с какими полномочиями открывать файл;
2 вопрос. почему final?
это вам к истокам Java, можно и без файнала, но лучше с ним, а ещё лучше static добавить, а прямой ответ на ваш вопрос - что бы SAVED_TEXT существовал в единственном экземпляре
3 вопрос. String всегда пишется или есть другие варианты? Если да, то какие и когда применяются?
4 вопрос. SAVED_TEXT - наименование переменной, что здесь можно писать и где ещё это наименование используется в дальнейшем?
5 вопрос. "saved_text" - значение, это просто название как в паре ключ-значение?
отвечу на эти три вопроса так как они пересекаются: SAVED_TEXT это поле ключ с которым вы сохраняете нужное значение в файл, и с которым вы потом сможете достать то значение которое сохранили, именование переменной может быть любой главное что бы содержимое было одинаковое, тип должен быть стринг так как методы put* и get* ключи используются стринги;
6. вопрос а если не надо отображать данные на экране, то тогда где вызывать?
странный вопрос, так как вы можете вызывать где хотите, и можете делать с данными что захотите, хоть на марс их отправить :)
7 вопрос. если мне нужно сохранять данные, полученные из запроса, к примеру, то что писать в следующем отрывке?
здесь не совсем понятно что нужно, обрисовывайте проблему и будем решать.
R.id.team
Политика на форуме запрещена

$01ny$hko
Сообщения: 44
Зарегистрирован: 18 окт 2012, 10:11

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

Сообщение $01ny$hko » 19 янв 2013, 19:21

здесь не совсем понятно что нужно, обрисовывайте проблему и будем решать.
. Выложу ка свои художества может по коду будет видно что осталось непонятым...

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

public class MainActivity extends Activity {
	
	SharedPreferences myPreferences;
	TextView prefText, jsonText;
	GetAsyncTask getATask;
	final String SavePlace = "place";
	
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		prefText = (TextView) findViewById(R.id.pref);
		jsonText = (TextView) findViewById(R.id.json);
		
		myPreferences = getSharedPreferences("myPref", MODE_PRIVATE);

		loadText();
		
		getATask = new GetAsyncTask();  
		getATask.execute("http://здесь запрос");
		
		
	}
	
	
	// метод требует синхронизации, т.к. он вызывается из потоков тасков
		private synchronized void parsingDataInView(JSONArray jsonArray)
				throws JSONException {
			// Если первый объект имеет ключ "place"
			if (jsonArray.getJSONObject(0).has("place")) {
				JSONObject jsonObject = jsonArray.getJSONObject(0);
				jsonText.setText("Вы на " + jsonObject.getString("place") + " месте");
				Editor editor =  myPreferences.edit();
				editor.putString(SavePlace, jsonObject.getString("place").toString());
				editor.commit();

			
		}
	
	
private void loadText() {
			// TODO Auto-generated method stub
	 myPreferences = getSharedPreferences("myPref", MODE_PRIVATE);
	    String savedText = myPreferences.getString(SavePlace, "");  // почему в начале строки  savedText ведь строка имеет другое название???
	    prefText.setText(savedText);
			
		}


class GetAsyncTask extends AsyncTask<String, Void, String> {

		
	BufferedReader in = null;
	String page = "Нет данных"; // Заполняем на тот случай если она не измениться в результате ошибки в блоке try

		
		@Override
		protected void onPreExecute() {
			super.onPreExecute();
			Log.d("my tag", "начало");
					
		}
		
		@Override
		protected String doInBackground(String... url) { 
			try {
				
				Log.d("myTag", "отправка запроса"); 
				// ))
				HttpClient client = new DefaultHttpClient();
				HttpGet request = new HttpGet();
				request.setURI(new URI(url[0])); 
				HttpResponse response = client.execute(request); // посылаем запрос
				in = new BufferedReader(new InputStreamReader(response
						.getEntity().getContent()));
				StringBuffer sb = new StringBuffer(""); // в этом буфере накапливаем данные которые пришли
				String line = "";
				String NL = System.getProperty("line.separator");
				while ((line = in.readLine()) != null) { // здесь ждём пока придут все данные
					sb.append(line + NL);
				}
				in.close();
				page = sb.toString(); // вот строка с результатом
				Log.d("myTag", "Результат запроса: \n" + page); // выводим её в лог
	
			} catch (URISyntaxException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (ClientProtocolException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} finally {

				if (in != null) {
					try {
						in.close();
					} catch (IOException e) {
						e.printStackTrace();
					}
				}
			}
			return page;
		}// doInBackground
		
		@Override
		protected void onPostExecute(String result) {			
			super.onPostExecute(result);
			Log.d("my tag", "завершение");
			
		
		try {
			parsingDataInView(new JSONArray(result));
		} catch (JSONException e) {
			e.printStackTrace();
		}
	

			
	}
	

	
	}

	@Override
	protected void onPause() {
		saveText();
		super.onPause();
	}


	private void saveText() {
		// TODO Auto-generated method stub
		
	}

}
Код работать то конечно работает..., но есть смутные подозрения, что не всё на своих местах...?
И пока не забыла всё-таки со String недопоняла - других вариантов кроме String не бывает?

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

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

Сообщение rezak90 » 19 янв 2013, 20:14

И пока не забыла всё-таки со String недопоняла - других вариантов кроме String не бывает?
вы имеете в виду сохранять только стринг можно?
R.id.team
Политика на форуме запрещена

$01ny$hko
Сообщения: 44
Зарегистрирован: 18 окт 2012, 10:11

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

Сообщение $01ny$hko » 21 янв 2013, 13:27

вы имеете в виду сохранять только стринг можно?
Да, может быть только final String или кроме строки ещё что-то можно сохранить?
И в следующей строке из кода недопонимание осталось

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

 String savedText = myPreferences.getString(SavePlace, "");  // почему в начале строки  savedText ведь строка имеет другое название???

Andy_ua
Сообщения: 21
Зарегистрирован: 06 июл 2012, 17:23

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

Сообщение Andy_ua » 22 янв 2013, 19:58

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

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

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

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

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

Сообщение Mikhail_dev » 25 янв 2013, 12:13

Здравствуйте. Подскажите с маленьким вопросом.
Есть CheckBoxPreference, который лежит в настройках. Мне надо программно изменить ему значение свойства enabled. И надо это сделать в сервисе. В сервисе нету метода findPreference.
Пока вижу только один вариант, а именно кидать бродкаст с сервиса, в настройках его ловить и уже там приводить искать элемент

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

Preference prefereces=findPreference("pref_screen_log");
и после приводить к View и менять значение.

Есть какие-либо другие идеи?

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

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

Сообщение Mikhail_dev » 25 янв 2013, 13:32

Всё, разобрался. Помог 73 урок, где программно меняют свойства. Еще раз огромное спасибо за материал!

Parfiry
Сообщения: 4
Зарегистрирован: 02 дек 2012, 15:17

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

Сообщение Parfiry » 30 янв 2013, 17:49

Такой вопрос, коллеги - форумчане. Возможно, кто подскажет решение. В моем приложении в preference сохраняется профиль пользователя. В зависимости от существования этого файла .xml:
- приложение считывает поля этого файла (если он существует);
- приложение вызывает активити для создания этого файла (если файла не существует).

Собственно, задача в том что мне нужно узнать существует этот файл или нет. Подскажите, пожалуйста, как это возможно сделать?

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

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

Сообщение rezak90 » 30 янв 2013, 23:43

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

File file = new File("data/data/myapp/file.xml");
if(file.exists()) {
//существует
} else {
//не существует
}
Зачем учить Java, лучше сразу андроид :P
R.id.team
Политика на форуме запрещена

Ответить