Google Android - это несложно

Добро пожаловать на форум сайта startandroid.ru
Текущее время: 24 июн 2017, 23:32

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 205 ]  На страницу 1, 2, 3, 4, 5 ... 11  След.
Автор Сообщение
СообщениеДобавлено: 24 ноя 2011, 03:00 
Администратор
Аватар пользователя

Зарегистрирован: 07 янв 2012, 11:32
Сообщений: 1333
Благодарил (а): 0 раз.
Поблагодарили: 72 раз.
В этом уроке:

- подробно разбираем метод чтения данных query
- используем сортировку, группировку, условия, having

Click here to read this article!

_________________
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение


Последний раз редактировалось damager82 01 май 2017, 16:40, всего редактировалось 11 раз(а).

Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 03 июн 2012, 16:31 

Зарегистрирован: 28 май 2012, 00:37
Сообщений: 4
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Вопрос по организации кода.
Зачем получать курсор в каждом кейсе. Ведь переменные то мы и так установили все в null. Можно же один раз курсор получить после switch. Или же для этого были другие причины???


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 04 июн 2012, 10:51 
Администратор
Аватар пользователя

Зарегистрирован: 07 янв 2012, 11:32
Сообщений: 1333
Благодарил (а): 0 раз.
Поблагодарили: 72 раз.
ermek6 писал(а):
Зачем получать курсор в каждом кейсе.

Только для большей наглядности. Чтоб читатель четко видел какие параметры в методе используются для каждого случая.

_________________
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 11 авг 2012, 17:56 

Зарегистрирован: 09 авг 2012, 19:07
Сообщений: 6
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Здравствуйте.
Огромное спасибо за уроки.

Объясните, пожалуйста, эту конструкцию:
for (String cn : c.getColumnNames())


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 11 авг 2012, 20:44 

Зарегистрирован: 09 авг 2012, 19:07
Сообщений: 6
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Еще вопрос.
Есть такой код:
btnAll = (Button) findViewById(R.id.btnAll);
btnAll.setOnClickListener(this);

я его пишу так:
((Button) findViewById(R.id.btnAll)).setOnClickListener(this);

Когда мы эмулируем нажатие кнопки то первый вариант отлично работает а второй нет, выбрасывается исключение: java.lang.NullPointerException
Но при клике второй вариант тоже отлично работает.
Кто сможет объяснить почему так?


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 11 авг 2012, 22:14 

Зарегистрирован: 16 июл 2012, 07:47
Сообщений: 235
Благодарил (а): 0 раз.
Поблагодарили: 25 раз.
1. for (String cn : c.getColumnNames()) - это аналог foreach в C#. В java решили не вводить новое ключевое слово. Можно перебирать содержимое коллеции или массива.
2. ((Button) findViewById(R.id.btnAll)).setOnClickListener(this); можно упростить до findViewById(R.id.btnAll).setOnClickListener(this); - клик можно ставить на любой View, а не только на кнопки.
java.lang.NullPointerException может появиться в первоначальном варианте, если будет найдена не кнопка, в упрощёном - если ничего не найдено.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 12 авг 2012, 10:52 

Зарегистрирован: 09 авг 2012, 19:07
Сообщений: 6
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
math64 писал(а):
это аналог foreach в C#

Большое спасибо. :!:

Тем не менее 2 вопрос остается открытым.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 12 авг 2012, 18:40 

Зарегистрирован: 16 июл 2012, 07:47
Сообщений: 235
Благодарил (а): 0 раз.
Поблагодарили: 25 раз.
Т.е. ты хочешь упростить
Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1. btnAll = (Button) findViewById(R.id.btnAll);
  2. btnAll.setOnClickListener(this);
  3. ...
  4. onClick(btnAll);
из примера?
упрощается так:
Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1. View btnAll = findViewById(R.id.btnAll);
  2. btnAll.setOnClickListener(this);
  3. ...
  4. onClick(btnAll);

Объявление поля Button btnAll; из класса удаляется, как и остальных кнопок (для которых даже локальных переменных не нужно выделять) - эти поля нигде не используются.
Однако, если к кнопке нужно обращение из других методов, лучше найти её и запомнить в поле класса в метода onCreate - чтобы больше не искать.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 13 авг 2012, 10:27 
Аватар пользователя

Зарегистрирован: 26 июн 2012, 13:22
Сообщений: 3422
Откуда: UA
Благодарил (а): 11 раз.
Поблагодарили: 244 раз.
java.lang.NullPointerException выскакивает из-за того что операция выполняется справа на лево, вот переменной сначала нету а ты уже вешаешь обработчик, вот оно и нулл выкидывает... если я не ошибаюсь, а то с утра могу и натупить =)

_________________
R.id.team
Политика на форуме запрещена


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 13 авг 2012, 10:53 

Зарегистрирован: 16 июл 2012, 07:47
Сообщений: 235
Благодарил (а): 0 раз.
Поблагодарили: 25 раз.
rezak - нет, из-за того что убрали инициализацию поля класса btnAll, а затем используют неинициализируемую в onClick(btnAll). Поле класса нужно убрать, заменить на локальную переменную - тогда компилятор выдаст предупреждение. Поле класса по умолчанию иницализируется в null, а локальная переменная должна инициализироваться программистом.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 14 авг 2012, 14:58 

Зарегистрирован: 09 авг 2012, 19:07
Сообщений: 6
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
math64 писал(а):
rezak - нет, из-за того что убрали инициализацию поля класса btnAll, а затем используют неинициализируемую в onClick(btnAll). Поле класса нужно убрать, заменить на локальную переменную - тогда компилятор выдаст предупреждение. Поле класса по умолчанию иницализируется в null, а локальная переменная должна инициализироваться программистом.


Вот спасибо! Теперь ясно.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 20 авг 2012, 13:18 

Зарегистрирован: 11 июн 2012, 15:42
Сообщений: 18
Благодарил (а): 2 раз.
Поблагодарили: 0 раз.
do {
str = "";
for (String cn : c.getColumnNames()) {
str = str.concat(cn + " = "
+ c.getString(c.getColumnIndex(cn)) + "; ");
}
Log.d(LOG_TAG, str);

} while (c.moveToNext());
Не могли бы вы подробней описать этот код.
for (String cn : c.getColumnNames()) как работает этот цикл? что означает двоеточие тут?
str.concat что делает эта функция?


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 20 авг 2012, 14:05 

Зарегистрирован: 16 июл 2012, 07:47
Сообщений: 235
Благодарил (а): 0 раз.
Поблагодарили: 25 раз.
Я уже обяснял выше в этой теме: for( v : collection) - это соответвует foreach в C#. ; двоеточие соответствует in. Перебирается содержимое коллекции.
concat() - конкатенация, вместо неё можно использовать + (точнее, все вызовы + для строк заменяются на вызов concat() ).


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 20 авг 2012, 14:29 
Аватар пользователя

Зарегистрирован: 26 июн 2012, 13:22
Сообщений: 3422
Откуда: UA
Благодарил (а): 11 раз.
Поблагодарили: 244 раз.
видно по форуму просто не все знакомы не то что с явой а и с шарпом =) ... так что трудно конечно им и возникают такие вот вопросы.

_________________
R.id.team
Политика на форуме запрещена


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 21 авг 2012, 13:24 

Зарегистрирован: 25 янв 2012, 02:25
Сообщений: 6
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Добрый день. Подскажите как можно в качестве сравниваемого значение передать массив например region = {"Америка", "Азия"}. Именно список.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 21 авг 2012, 13:31 
Аватар пользователя

Зарегистрирован: 26 июн 2012, 13:22
Сообщений: 3422
Откуда: UA
Благодарил (а): 11 раз.
Поблагодарили: 244 раз.
zavbak писал(а):
Добрый день. Подскажите как можно в качестве сравниваемого значение передать массив например region = {"Америка", "Азия"}. Именно список.

куда передать? я так понял хотите сравнить значения в массиве со значениями в бд?

_________________
R.id.team
Политика на форуме запрещена


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 21 авг 2012, 13:49 

Зарегистрирован: 16 июл 2012, 07:47
Сообщений: 235
Благодарил (а): 0 раз.
Поблагодарили: 25 раз.
zavbak писал(а):
Добрый день. Подскажите как можно в качестве сравниваемого значение передать массив например region = {"Америка", "Азия"}. Именно список.

WHERE region IN ( 'Америка', 'Азия')
или создать таблицу Continents - тогда
WHERE region = Continents.name

http://www.sqlite.org/lang_expr.html


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 22 авг 2012, 01:13 

Зарегистрирован: 25 янв 2012, 02:25
Сообщений: 6
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
math64 писал(а):
zavbak писал(а):
Добрый день. Подскажите как можно в качестве сравниваемого значение передать массив например region = {"Америка", "Азия"}. Именно список.

WHERE region IN ( 'Америка', 'Азия')
или создать таблицу Continents - тогда
WHERE region = Continents.name

http://www.sqlite.org/lang_expr.html




А массив в качестве параметра передать нельзя?


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 22 авг 2012, 07:42 

Зарегистрирован: 16 июл 2012, 07:47
Сообщений: 235
Благодарил (а): 0 раз.
Поблагодарили: 25 раз.
zavbak писал(а):
А массив в качестве параметра передать нельзя?

Нет, конечно. Параметр заменяет число или строку в SQL запросе. Если передадите массив, вызовется, полягаю, метод toString(), т.е. параметр будет заменён на хеш-код массива. А в SQL в Вашем случае нужно применть IN или JOIN со вспомогательной таблицей, которой будут записи 'Америка' и 'Азия':
Вот полные SQL:
Код: [ Загрузить ] [ Скрыть ]
Using SQL Syntax Highlighting
  1. SELECT field1, field2, region FROM table1 WHERE region IN ('Америка', 'Азия')
  2. SELECT t.field1, t.field2, t.region FROM table1 AS t JOIN continents AS c ON t.region = c.name
  3.  


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 22 авг 2012, 08:54 
Аватар пользователя

Зарегистрирован: 17 фев 2012, 21:23
Сообщений: 1339
Откуда: Мордор
Благодарил (а): 16 раз.
Поблагодарили: 161 раз.
Второй вариант будет хорошь если записи уже имеются в базе. А если даже таблици такой нет или есть но нужны только те которые выбрал пользователь?
А первый вариант так и просит сделать ему SQL инъекцию :)

Я вот подумал, может такой вариант сойдет?
Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1. String paramString ="?";
  2. for(i = 2; i < paramArray.size() - 1; i++)
  3.   paramString = paramString + ",?";
  4. String sqlString ="SELECT * FROM table WHERE region IN (" + paramString + ")";
  5. Cursor cursor = db.rawQuery (sqlString, paramArray)
Работоспособность не проверял, вроде должно работать.

_________________
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 205 ]  На страницу 1, 2, 3, 4, 5 ... 11  След.

Часовой пояс: UTC + 3 часа


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
cron
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB