Урок 36. SQLite. Подробнее про метод query. Условие, сортировка, группировка

Обсуждение уроков
kan_08
Сообщения: 39
Зарегистрирован: 11 апр 2013, 13:01

Re: Урок 36. SQLite. Подробнее про метод query. Условие, сор

Сообщение kan_08 » 26 апр 2013, 08:27

Вопрос не совсем по уроку. Что значит final перед объявлением переменных?
Например final String LOG_TAG = "myLogs";
И что значит public в объявлении функции.

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 36. SQLite. Подробнее про метод query. Условие, сор

Сообщение Foenix » 26 апр 2013, 08:38

kan_08 писал(а):Вопрос не совсем по уроку. Что значит final перед объявлением переменных?
Например final String LOG_TAG = "myLogs";
И что значит public в объявлении функции.
очень советую все-таки почитать про это как-то системно про ООП, т.к. по таким вопросам видно, что вы программируете, но мало что понимаете что происходит.
public - публичные, доступные вне класса ( к ним можно обращаться отовсюду)
final - те, которые не будут перегружаться в классах-наследниках.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Serge
Сообщения: 5
Зарегистрирован: 24 июн 2013, 16:29

Re: Урок 36. SQLite. Подробнее про метод query. Условие, сор

Сообщение Serge » 12 июл 2013, 18:45

Подскажите, пожалуйста, как эмулировать нажатие кнопки?
Урок работает, кроме одной строчки:
onCick(btnAll);

Эклипс предлагает добавить следующий метод:
private void onCick(Button btnAll2) {
// TODO Auto-generated method stub
}

В случае замены на
onCick((View)btnAll);
предлагает добавить метод:
private void onCick(View btnAll2) {
// TODO Auto-generated method stub
}

На существующий в классе метод public void onClick(View v) внимания не обращает.
В чём может быть проблема?

Аватара пользователя
anber
Сообщения: 584
Зарегистрирован: 10 июн 2013, 15:05
Откуда: UA

Re: Урок 36. SQLite. Подробнее про метод query. Условие, сор

Сообщение anber » 12 июл 2013, 18:48

Serge писал(а):Подскажите, пожалуйста, как эмулировать нажатие кнопки?
Урок работает, кроме одной строчки:
onCick(btnAll);

Эклипс предлагает добавить следующий метод:
private void onCick(Button btnAll2) {
// TODO Auto-generated method stub
}

В случае замены на
onCick((View)btnAll);
предлагает добавить метод:
private void onCick(View btnAll2) {
// TODO Auto-generated method stub
}

На существующий в классе метод public void onClick(View v) внимания не обращает.
В чём может быть проблема?
код покажи
Личные сообщения с просьбой ответить на форуме или написать программу я просто удаляю, если я в хорошем настроении. Если в плохом добавляю автора в черный список. По любым другим вопросам feel free to write to me.

Serge
Сообщения: 5
Зарегистрирован: 24 июн 2013, 16:29

Re: Урок 36. SQLite. Подробнее про метод query. Условие, сор

Сообщение Serge » 12 июл 2013, 18:50

anber писал(а): код покажи
да код вроде как в уроке

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

package ru.startandroid.develop.p0361sqlitequery;

import android.app.Activity;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RadioGroup;

public class MainActivity extends Activity implements OnClickListener {

	final String LOG_TAG = "MyLogs";
	
	String name[] = { "Китай", "США", "Бразилия", "Россия",
			"Япония", "Германия", "Египет", "Италия", "Франция", "Канада"};
	
	int people[] = {1400,311,195,142,128,82,80,60,66,35};
	String region[] = {"Азия","Америка","Америка","Европа","Азия",
			"Европа","Африка","Европа","Европа","Америка"};
	
	Button btnAll, btnFunc, btnPeople, btnSort, btnGroup, btnHaving;
	EditText etFunc, etPeople, etRegionPeople;
	RadioGroup rgSort;
	
	DBHelper dbHelper;
	SQLiteDatabase db;
	

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		btnAll = (Button)findViewById(R.id.btnAll);
		btnAll.setOnClickListener(this);
		
		btnFunc = (Button)findViewById(R.id.btnFunc);
		btnFunc.setOnClickListener(this);
		
		btnPeople = (Button)findViewById(R.id.btnPeople);
		btnPeople.setOnClickListener(this);
		
		btnSort = (Button)findViewById(R.id.btnSort);
		btnSort.setOnClickListener(this);
		
		btnGroup = (Button)findViewById(R.id.btnGroup);
		btnGroup.setOnClickListener(this);
		
		btnHaving = (Button)findViewById(R.id.btnHaving);
		btnHaving.setOnClickListener(this);
		
		etFunc = (EditText)findViewById(R.id.etFunc);
		etPeople = (EditText)findViewById(R.id.etPeople);
		etRegionPeople=(EditText)findViewById(R.id.etRegionPeople);
		
		rgSort = (RadioGroup)findViewById(R.id.rgSort);
		
		dbHelper = new DBHelper(this);
		//Подключаемся к базе
		db = dbHelper.getWritableDatabase();
		
		//проверка существования записей
		Cursor c = db.query("mytable", null,null,null,null,null,null);
		if (c.getCount() == 0){
			ContentValues cv = new ContentValues();
			//заполним таблицу
			for (int i=0; i<10; i++){
				cv.put("name", name[i]);
				cv.put("people", people[i]);
				cv.put("region", region[i]);
				Log.d(LOG_TAG, "id = "+ db.insert("mytable", null, cv));
			}
		}
		dbHelper.close();
		//эмулируем нажатие кнопки btnAll
		//onCick((View)btnAll);
		
		onCick(btnAll);
	}



	public void onClick(View v) {
		//подключаемся к базе
		db = dbHelper.getWritableDatabase();
		//данные с экрана
		String sFunc = etFunc.getText().toString();
		String sPeople = etPeople.getText().toString();
		String sRegionPeople = etRegionPeople.getText().toString();
		
		//переменные для query
		String[] columns = null;
		String selection = null;
		String[] selectionArgs = null;
		String groupBy = null;
		String having = null;
		String orderBy = null;
		//курсор
		Cursor c = null;
		//определяем нажатую кнопку
		switch (v.getId()){
		//все записи
		case R.id.btnAll:
			Log.d(LOG_TAG, "--- Все записи ---");
			c = db.query("mytable", null,null,null,null,null,null);
			break;
			//Функция
		case R.id.btnFunc:
			Log.d(LOG_TAG, "--- Функция " + sFunc+ " ---" );
			columns = new String[] {sFunc};
			c = db.query("mytable", columns, null, null, null, null, null);
			break;
			//Население больше чем
		case R.id.btnPeople:
			Log.d(LOG_TAG, "--- Население больше " + sPeople+" ---");
			selection = "people > ?";
			selectionArgs = new String[] {sPeople};
			c = db.query("mytable", null, selection, selectionArgs, null, null, null);
			break;
			//Население по региону
		case R.id.btnGroup:
			Log.d(LOG_TAG, "--- Население по региону ---");
			columns = new String[] {"region", "sum(people) as people"};
			groupBy = "region";
			c = db.query("mytable", columns, null,null, groupBy, null, null);
			break;
			//Население по региону больше чем
		case R.id.btnHaving:
			Log.d(LOG_TAG, "--- Регионы с населением больше " + sRegionPeople + " ---");
			columns = new String[] {"region", "sum(people) as people"};
			groupBy = "region";
			having = "sum(people) > " + sRegionPeople;
			c = db.query("mytable", columns, null,null, groupBy, having, null);
			break;
			//Сортировка
		case R.id.btnSort:
			//сортировка по
			switch (rgSort.getCheckedRadioButtonId()){
			case R.id.rName:
				Log.d(LOG_TAG, "--- Сортировка по наименованию ---");
				orderBy = "name";
				break;
			case R.id.rPeople:
				Log.d(LOG_TAG,"--- Сортировка по населению ---");
				orderBy = "people";
				break;
			case R.id.rRegion:
				Log.d(LOG_TAG, "--- Сортировка по региону ---");
				orderBy = "region";
				break;
			}
			c = db.query("mytable", null, null, null, null, null, orderBy);
			break;
		}
		
		if (c != null){
			if (c.moveToFirst()){
				String str;
				do {
					str = "";
					for (String cn : c.getColumnNames()){
						str = str.concat(cn+" = "+ c.getString(c.getColumnIndex(cn)) +"; ");
					}
					Log.d(LOG_TAG, str);
				}while (c.moveToNext());
				
			}else
				Log.d(LOG_TAG, "Cursor is null");
			
			dbHelper.close();
		}
	}
	
	class DBHelper extends SQLiteOpenHelper {

		public DBHelper(Context context){
			//конструктор суперкласса
			super(context, "myDB", null, 1);
		}
		
		
		@Override
		public void onCreate(SQLiteDatabase db) {
			Log.d(LOG_TAG, "--- On create Database ---");
			// создаём таблицу с полями
			db.execSQL("create table mytable( " +
					"id integer primary key autoincrement," +
					"name text," +
					"people integer," +
					"region text);");
			
		}

		@Override
		public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
			// TODO Auto-generated method stub
			
		}
		
	}
	
	

}


Аватара пользователя
anber
Сообщения: 584
Зарегистрирован: 10 июн 2013, 15:05
Откуда: UA

Re: Урок 36. SQLite. Подробнее про метод query. Условие, сор

Сообщение anber » 12 июл 2013, 18:59

Вроде все верно.
>>>Урок работает, кроме одной строчки: onCick(btnAll);
Ошибку какую пишет?
ЗЫ, попробуй нажать на проекте правой кнопкой мыши в выбрать Refresh а также в главном меню Project - Clean...
Личные сообщения с просьбой ответить на форуме или написать программу я просто удаляю, если я в хорошем настроении. Если в плохом добавляю автора в черный список. По любым другим вопросам feel free to write to me.

Serge
Сообщения: 5
Зарегистрирован: 24 июн 2013, 16:29

Re: Урок 36. SQLite. Подробнее про метод query. Условие, сор

Сообщение Serge » 12 июл 2013, 20:48

anber писал(а):Вроде все верно.
>>>Урок работает, кроме одной строчки: onCick(btnAll);
Ошибку какую пишет?
ЗЫ, попробуй нажать на проекте правой кнопкой мыши в выбрать Refresh а также в главном меню Project - Clean...
После рефреша то же самое.
Да не видит он функцию OnClick которая паблик и предлагает создать протектед.
Изображение

Аватара пользователя
anber
Сообщения: 584
Зарегистрирован: 10 июн 2013, 15:05
Откуда: UA

Re: Урок 36. SQLite. Подробнее про метод query. Условие, сор

Сообщение anber » 12 июл 2013, 20:55

onCick()
onClick()
найди 10 отличий
Личные сообщения с просьбой ответить на форуме или написать программу я просто удаляю, если я в хорошем настроении. Если в плохом добавляю автора в черный список. По любым другим вопросам feel free to write to me.

aleksbim
Сообщения: 81
Зарегистрирован: 02 фев 2013, 02:52

Re: Урок 36. SQLite. Подробнее про метод query. Условие, сор

Сообщение aleksbim » 29 июл 2013, 22:15

Поддерживаю один из вопросов, заданных выше. Объясните пжл, что означает sum(people) as people, либо ткните меня носом в конкретный раздел каких нибудь русских уроков по SQLite где можно понять суть набора этих (символов) as символов?

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 36. SQLite. Подробнее про метод query. Условие, сор

Сообщение Foenix » 30 июл 2013, 00:52

это означает, что суммируются все значения пипл, а само поле результата будет названо пипл. Если не назвать никак, наименование может быть непредсказуемым в данном случае. Эз - это по английски - "как". (английскую клаву уже не видно, сорри).
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
Isaev
Сообщения: 145
Зарегистрирован: 03 сен 2013, 09:39
Откуда: Германия
Контактная информация:

Re: Урок 36. SQLite. Подробнее про метод query. Условие, сор

Сообщение Isaev » 16 окт 2013, 14:25

их население (в тысячах)
всё же в млн, а не а тыс. поправте

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

Re: Урок 36. SQLite. Подробнее про метод query. Условие, сор

Сообщение damager82 » 17 окт 2013, 23:52

Isaev писал(а):
их население (в тысячах)
всё же в млн, а не а тыс. поправте
Спасибо, пофиксил!
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Аватара пользователя
-Alex-
Сообщения: 30
Зарегистрирован: 26 ноя 2013, 09:40

Re: Урок 36. SQLite. Подробнее про метод query. Условие, сор

Сообщение -Alex- » 26 ноя 2013, 09:48

Добрый день, уважаемые гуру :)
Я начал изучать программирование на Android около 2-х недель назад. Обучение происходит туго и со скрипом, но все же продвигается.
У меня возник вопрос, с которым бьюсь и не могу продвигаться вперед. Может кто-нибудь сможет помочь мне.
Допустим у меня есть БД и при нажатии кнопки на экране, в TextView мне необходимо выводить значение из таблицы БД. При повторном нажатии на кнопку должно выводиться новое значение на экран в TextView.
Интересует механизм, как это можно сделать, допустим по порядку выводить и в случайном порядке. Пока получается только выводить, например, или первое значение через moveToFirst или последнее moveToLast.
А как сделать, чтобы при каждом нажатии выводилось новое значение.
Заранее благодарен за любые ответы.

WizikTLT
Сообщения: 52
Зарегистрирован: 01 ноя 2013, 13:30

Re: Урок 36. SQLite. Подробнее про метод query. Условие, сор

Сообщение WizikTLT » 26 ноя 2013, 09:57

Первое что пришло в голову -
Пройтись по рез-ту выборки из Бд и сохранить в какой-нибудь массив
а далее ты при нажатии на кнопку будешь брать не из Бд, а из массива - а там уже можно по индексу выбирать случайные значение ( например через Random )

Аватара пользователя
-Alex-
Сообщения: 30
Зарегистрирован: 26 ноя 2013, 09:40

Re: Урок 36. SQLite. Подробнее про метод query. Условие, сор

Сообщение -Alex- » 26 ноя 2013, 10:04

WizikTLT писал(а): Пройтись по рез-ту выборки из Бд и сохранить в какой-нибудь массив
Спасибо за ответ, а не могли бы Вы подсказать, в каком уроке можно изучить данный вопрос?

Аватара пользователя
trew
Сообщения: 450
Зарегистрирован: 28 сен 2013, 17:34

Re: Урок 36. SQLite. Подробнее про метод query. Условие, сор

Сообщение trew » 26 ноя 2013, 10:32

-Alex- писал(а):
WizikTLT писал(а): Пройтись по рез-ту выборки из Бд и сохранить в какой-нибудь массив
Спасибо за ответ, а не могли бы Вы подсказать, в каком уроке можно изучить данный вопрос?
Такого урока нет, на этом сайте.
Берёте Random и массив - и выбираете.
Когда выкладываете код на форум - код оформляйте. Редактор - поищите слова Geshi Syntax -Java. (или xml)
Свои сообщения можно редактировать - кнопка edit.

WizikTLT
Сообщения: 52
Зарегистрирован: 01 ноя 2013, 13:30

Re: Урок 36. SQLite. Подробнее про метод query. Условие, сор

Сообщение WizikTLT » 26 ноя 2013, 10:41

Например в 34 есть,
В качестве массива можно взять например Map
Map result = new HashMap< Int,String>();
дальше в цикле обходишь курсор свой.
do {
закидываешь в map значения
result.put(cursor.getInt('Номер колонки ID'), cursor.getString('Номер колонки с данными для вывода в TextView'));
// переход на следующую строку
// а если следующей нет (текущая - последняя), то false - выходим из цикла
} while (cursor.moveToNext());

далее значения можешь получать -

String s = result.get('тут айдишник рандомной записи ');

Аватара пользователя
-Alex-
Сообщения: 30
Зарегистрирован: 26 ноя 2013, 09:40

Re: Урок 36. SQLite. Подробнее про метод query. Условие, сор

Сообщение -Alex- » 26 ноя 2013, 10:46

Спасибо огромное. Теперь понятно в каком направлении копать.

WizikTLT
Сообщения: 52
Зарегистрирован: 01 ноя 2013, 13:30

Re: Урок 36. SQLite. Подробнее про метод query. Условие, сор

Сообщение WizikTLT » 26 ноя 2013, 10:54

Лучше конечно завести новый класс, в котором будут все нужные тебе поля из курсора и потом в качестве массива использовать ArrayList<Твой класс> al = new ArrayList<Твой класс>();
В цикле будешь создавать новый экземпляр твоего класса и через al.add(экземпляр класса); добавлять в список
потом когда надо будет достать что-то используй
al.get(айдишник записи)- он вернет тебе сохраненный экземпляр твоего класса, а потом можешь достать значение любого поля из него.

Аватара пользователя
-Alex-
Сообщения: 30
Зарегистрирован: 26 ноя 2013, 09:40

Re: Урок 36. SQLite. Подробнее про метод query. Условие, сор

Сообщение -Alex- » 28 ноя 2013, 12:42

Добрый день.
Всё продолжаю биться над старой проблемой.
Теперь уже получается заполнить массив из БД.
А вот прочитать данные из массива при нажатии кнопки не получается.
Привожу ниже код. Почему-то s выдает значение null, хотя Log.d(LOG_TAG, "result = " + result) показывает, что данные существуют.
Если у кого есть возможность, посмотрите, пожалуйста, в чем может быть моя ошибка.
Заранее спасибо

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

@Override
	public void onClick(View v) {

		SQLiteDatabase db = dbHelper.getWritableDatabase();

		Cursor c = db.query("mytable", null, null, null, null, null, null);

		switch (v.getId()) {
		
		case R.id.btnMainFwd:
			Log.d(LOG_TAG, "=== Читаем одну запись ===");

			int idColIndex = c.getColumnIndex("id");
			int engColIndex = c.getColumnIndex("engWord");
			int rusColIndex = c.getColumnIndex("rusWord");

			Map result = new HashMap<String, String>();

			if (c.moveToFirst()) {
				
				do {
					result.put(c.getString(engColIndex), c.getString(rusColIndex));

					Log.d(LOG_TAG, "result = " + result);

				} while (c.moveToNext());
				
				Random rand = new Random();
				for (int i = 0; i < 1; i++) {
					String s = (String) result.get(rand.nextInt(engColIndex));
					Log.d(LOG_TAG, "s = " + s);
				}
			} else
				Log.d(LOG_TAG, "0 rows");


			c.close();
			break;

Ответить