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

Обсуждение уроков
Max2
Сообщения: 3
Зарегистрирован: 02 мар 2014, 10:51

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

Сообщение Max2 » 02 мар 2014, 11:04

Добрый день, подскажите,пожалуйста, почему не работает(возвращает null)

public Cursor getTaskByName(String taskName){
try{
Cursor c= mDB.query(DB_TABLE_TASK, null, COLUMN_TASK_NAME+" = "+taskName, null,null,null,null);
return c;
}catch(SQLException e){
Log.d("myLogs","isNull");
return null;
}
}

причем существует все, что указано в запросе.В таблице пока одна запись и вызов

public Cursor getAllTaskData(){
return mDB.query(DB_TABLE_TASK,null,null,null,null,null,null);
}

работает и возвращает запись в которой COLUMN_TASK_NAME = taskName

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

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

Сообщение Foenix » 02 мар 2014, 15:46

1) форматируй код, никто его просто так не читает
2) в лог выводишь фигню
3) в логе ищи ошибку - там все написано
R.id.team

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

Max2
Сообщения: 3
Зарегистрирован: 02 мар 2014, 10:51

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

Сообщение Max2 » 02 мар 2014, 16:22

03-02 13:07:32.230: D/dalvikvm(6829): GC_EXTERNAL_ALLOC freed 88K, 52% free 2612K/5379K, external 2032K/2137K, paused 173ms
03-02 13:07:32.450: D/myLogs(6829): ActivityTaskPattern
03-02 13:07:32.500: D/myLogs(6829): getTaskByName Str s = name = Пример
03-02 13:07:32.500: I/Database(6829): sqlite returned: error code = 1, msg = no such column: Пример
03-02 13:07:32.510: D/myLogs(6829): isNull
03-02 13:07:32.520: D/AndroidRuntime(6829): Shutting down VM
03-02 13:07:32.520: W/dalvikvm(6829): threadid=1: thread exiting with uncaught exception (group=0x40015560)
03-02 13:07:32.562: E/AndroidRuntime(6829): FATAL EXCEPTION: main
03-02 13:07:32.562: E/AndroidRuntime(6829): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.proj_timer/com.example.proj_timer.ActivityTaskPattern}: java.lang.NullPointerException
03-02 13:07:32.562: E/AndroidRuntime(6829): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
03-02 13:07:32.562: E/AndroidRuntime(6829): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
03-02 13:07:32.562: E/AndroidRuntime(6829): at android.app.ActivityThread.access$1500(ActivityThread.java:117)
03-02 13:07:32.562: E/AndroidRuntime(6829): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
03-02 13:07:32.562: E/AndroidRuntime(6829): at android.os.Handler.dispatchMessage(Handler.java:99)
03-02 13:07:32.562: E/AndroidRuntime(6829): at android.os.Looper.loop(Looper.java:123)
03-02 13:07:32.562: E/AndroidRuntime(6829): at android.app.ActivityThread.main(ActivityThread.java:3683)
03-02 13:07:32.562: E/AndroidRuntime(6829): at java.lang.reflect.Method.invokeNative(Native Method)
03-02 13:07:32.562: E/AndroidRuntime(6829): at java.lang.reflect.Method.invoke(Method.java:507)
03-02 13:07:32.562: E/AndroidRuntime(6829): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
03-02 13:07:32.562: E/AndroidRuntime(6829): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
03-02 13:07:32.562: E/AndroidRuntime(6829): at dalvik.system.NativeStart.main(Native Method)
03-02 13:07:32.562: E/AndroidRuntime(6829): Caused by: java.lang.NullPointerException
03-02 13:07:32.562: E/AndroidRuntime(6829): at com.example.proj_timer.ActivityTaskPattern.onCreate(ActivityTaskPattern.java:44)
03-02 13:07:32.562: E/AndroidRuntime(6829): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
03-02 13:07:32.562: E/AndroidRuntime(6829): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
03-02 13:07:32.562: E/AndroidRuntime(6829): ... 11 more
03-02 13:07:36.260: I/Process(6829): Sending signal. PID: 6829 SIG: 9


3) :?: Думал я над ним, думал, кроме NullPointerException ничего не пойму, да и с чего он выкинулся?Запросы по другим полям(не текстовым) работают
2)что нужно выводить в лог, чтобы было информативней?
1)Где посмотреть как форматировать,как вставлять код?


Если убрать проверку исключений и оставить только

Cursor c= mDB.query(DB_TABLE_TASK, null, COLUMN_TASK_NAME+" = "+taskName, null,null,null,null);
return c;

, в логах появляется:

03-02 13:43:11.530: W/dalvikvm(15403): threadid=1: thread exiting with uncaught exception (group=0x40015560)
03-02 13:43:11.560: E/AndroidRuntime(15403): FATAL EXCEPTION: main
03-02 13:43:11.560: E/AndroidRuntime(15403): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.proj_timer/com.example.proj_timer.ActivityTaskPattern}: android.database.sqlite.SQLiteException: no such column: Пример: , while compiling: SELECT * FROM myTasks WHERE name = Пример
03-02 13:43:11.560: E/AndroidRuntime(15403): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
03-02 13:43:11.560: E/AndroidRuntime(15403): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)

myTasks- это DB_TABLE_TASK="myTasks", а name - COLUMN_TASK_NAME="name";

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

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

Сообщение Foenix » 02 мар 2014, 17:08

в разделе форума R.id.team посмотри последний вебинар, Он посвящен данной проблеме.
в логе ищешь строку Caused by: в ней название ошибки.
далее после нее идут адреса В ТВОЕЙ ПРОГРАММЕ, Т.е. например
at com.example.proj_timer. бла-бла-бла
щелкаешь туда два раза и ищешь ошибку!!!!!!!!!!!!!!!!!!



Вторая часть вопроса не имеет отношения к твоей ошибке, но запрос составлен не правильно. Если ты ищешь строку или подстроку в колонках таблицы, то нужно ее заключать в кавычки.
SELECT * FROM myTasks WHERE name = 'Пример'
ясно?
поэтому ошибка "нет такой колонки ПРимер" означает, что колонка сравнивается не со строкой "пример", а с другой какой-то колонкой Пример. Вот оно бедное и пишет тебе no such column: Пример


Как видишь, тебе компилятор все пишет. Зачем же тебе переводчики? Как программировать дальше будешь?
R.id.team

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

Max2
Сообщения: 3
Зарегистрирован: 02 мар 2014, 10:51

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

Сообщение Max2 » 02 мар 2014, 17:48

Не успел зарегистрироваться, уже дважды заглумили.Походу, суровое это ремесло-програмирование. :? За помощь большое спасибо!!!Помогло.

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

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

Сообщение Foenix » 02 мар 2014, 18:04

а ты как думал :)
R.id.team

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

_ILYA_
Сообщения: 41
Зарегистрирован: 06 окт 2013, 11:49

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

Сообщение _ILYA_ » 05 мар 2014, 20:56

Foenix писал(а):тогда почитай данную тему.
У тебя не правильно выбран способ хранения даты в таблице.
Хранить лучше двумя способами. Понятный - в формате "YYYYMMDD" и аутентичный, в формате int как число секунд даты (я забыла, кажется какой-то день 1971 го года). Все это было на форуме.
Если ничего не менять, в принципе, тоже можно. Примерно таким запросом.
select * from mytable where year = 2014 order by year desc, month decs,day desc
select *from mytable where month = 2 and year 2014 order by...
третий сам догадаешься
все же хотелось бы как надо сделать. Формат YYYYMMDD.
Тут возникло несколько вопросов:
1. Я хочу получить строку с датой формата 2014-03-05. делаю такой запрос

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

select _id, date(columndate) as dat from mytable
вместо 2014-03-05 получаю 50430-03-07 :o Что я не так делаю? :?:

2. Как мне получать не всю дату, а по отдельности год, месяц, день. :idea:
для получения года пробовал

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

select _id, year(columndate) as y from mytable
выбрасывает исключение

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

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

Сообщение Foenix » 05 мар 2014, 21:14

для манипуляций с датами используй класс Calendar
R.id.team

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

_ILYA_
Сообщения: 41
Зарегистрирован: 06 окт 2013, 11:49

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

Сообщение _ILYA_ » 05 мар 2014, 21:18

Foenix писал(а):для манипуляций с датами используй класс Calendar
Меня интересует как это SQL запросом сделать

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

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

Сообщение Foenix » 05 мар 2014, 21:49

ну попробуй функцию SUBSTR в запросе
R.id.team

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

SevenXP
Сообщения: 113
Зарегистрирован: 21 июл 2013, 18:20

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

Сообщение SevenXP » 24 мар 2014, 18:05

Что то найти не могу или еще что :)
Мне нужен SQL запрос с 2-мя параметрами Where
с 1 получается, но с двумя не знаю как:

where = " id_text = 2 language='ru' "
Как можно выполнить такой запрос?
SELECT * FROM Text WHERE id_text=2 language='ru'

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

...
	String where =  SQLiteData.TABLE_ARTICLE_COLUM_id_news +" = " +id_news;
	//	 +" " +	 SQLiteData.TABLE_ARTICLE_COLUN_language + " = "+ "'"+ language +"'";
		
			c = db_Worked.query(SQLiteData.TABLE_ARTICLE, null, where,
					 null, null, null, null);
...
Если я 1 передаю все работает, но мне нужна выборка по двум параметрам.

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

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

Сообщение Foenix » 24 мар 2014, 19:36

есть такое слово AND...................
R.id.team

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

SevenXP
Сообщения: 113
Зарегистрирован: 21 июл 2013, 18:20

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

Сообщение SevenXP » 25 мар 2014, 09:36

Foenix писал(а):есть такое слово AND...................
Блин точно, все сижу и вспомнить, не мог.

Это же AND OR еще можно и вложенный запрос сделать :) Блин нельзя работать по 9-10 часов :)

kirka_scant
Сообщения: 42
Зарегистрирован: 18 дек 2013, 14:54

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

Сообщение kirka_scant » 21 апр 2014, 08:25

Foenix писал(а):ну жути нагнал ))
вообще-то нужно различать использование данного формата в java и в sqlite . Там это вовсе не timestamp называется. И дело тут не в том, чтоб получить заданную величину секунд и потом ее отформатировать (кстати, можно юзать класс Calendar), а чтоб В СПИСКЕ (читай "в курсор") получить отформатированную дату, чтоб потом ее вывести на экран. Для этого нужно юзать только функции sqlite.
В общем, почитаь можно тут http://sqlite.org/lang_datefunc.html
Вообще говоря, можно и не паритсья, как я сказала.
Есть еще куча разных способов форматнуть (или не форматировать :) )дату и вывести ее на экран)
Заранее прошу прощения, но я был приятно удивлен, что Вы - женщина :) ;)

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

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

Сообщение Foenix » 21 апр 2014, 11:42

Она всех вечно удивляла,
Такая уж она была! (С)
:-D
P.S. Женщины на форуме есть, жаль, что нас мало
R.id.team

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

Дмитрий Х.
Сообщения: 4
Зарегистрирован: 15 май 2014, 12:26

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

Сообщение Дмитрий Х. » 15 май 2014, 12:49

public void onClick(View v) {

// подключаемся к базе
db = dbHelper.getWritableDatabase();
А зачем подключаться к БД каждый раз при нажатии на кнопку, а потом закрывать подключение? Разве того, что мы подключились в методе OnCreate не достаточно?
Последний раз редактировалось Дмитрий Х. 15 май 2014, 13:24, всего редактировалось 1 раз.

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

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

Сообщение Foenix » 15 май 2014, 13:20

это не подключение.
R.id.team

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

Дмитрий Х.
Сообщения: 4
Зарегистрирован: 15 май 2014, 12:26

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

Сообщение Дмитрий Х. » 15 май 2014, 14:01

Foenix писал(а):это не подключение.
А что тогда, если не соединение с БД?

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

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

Сообщение Foenix » 15 май 2014, 22:24

http://developer.android.com/reference/ ... leDatabase()

метод возвращает в переменную сам объект(instance) бд для записи/чтения
Судя по документу - это нужно делать каждый раз перед записью/чтением из нее.
R.id.team

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

Аватара пользователя
GOST
Сообщения: 16
Зарегистрирован: 25 июл 2014, 12:37
Откуда: UA

Re: Урок 36. SQLite. Подробнее про метод query.

Сообщение GOST » 02 авг 2014, 11:51

Добрый день, проблема с сортировкой стран.

РЕШЕНО! Забыл найти rgSort в onCreate(). :twisted: Отлаживать код поутру это зло!

вот мой код:

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

public void onClick(View v) {
	// TODO Auto-generated method stub
	db = dbHelper.getWritableDatabase();
		
	String sFunc = etFunc.getText().toString();
	String sPeople = etPeople.getText().toString();
	String sRegionPeople = etRegionPeople.getText().toString();
		
	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, "--- All notes ---");
		c = db.query("table1", null, null, null, null, null, null);
		break;
	case R.id.btnFunc:
		Log.d(LOG_TAG, "--- Function " + sFunc + " ---");
		columns = new String[] {sFunc};
		c = db.query("table1", columns, null, null, null, null, null);
		break;
	case R.id.btnPeople:
		Log.d(LOG_TAG, "--- Population more then " + sPeople + " ---");
		selection = "people > ?";
		selectionArgs = new String[] { sPeople };
		c = db.query("table1", null, selection, selectionArgs, null, null, null);
		break;
	case R.id.btnGroup:
		Log.d(LOG_TAG, "--- Population by region ---");
		columns = new String[] { "region", "sum(people) as people" };
		groupBy = "region";
		c = db.query("table1", columns, null, null, groupBy, null, null);
		break;
	case R.id.btnHaving:
		Log.d(LOG_TAG, "--- Population by region more than " + 
				sRegionPeople + " ---");
		columns = new String[] { "region", "sum(people) as people" };
		groupBy = "region";
		having = "sum(people) >" + sRegionPeople;
		c = db.query("table1", columns, null, null, groupBy, having, null);
		break;
	case R.id.btnSort:
		Log.d(LOG_TAG, "--- 1 ---");
		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;
		}
		Log.d(LOG_TAG, "--- 2 ---");
		c = db.query("table1", 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());
		}
		c.close();
	}
	else
		Log.d(LOG_TAG, "Cursor is null");
		
	dbHelper.close();
}
Вот лог:
08-02 11:23:32.478: E/AndroidRuntime(800): FATAL EXCEPTION: main
08-02 11:23:32.478: E/AndroidRuntime(800): java.lang.NullPointerException
08-02 11:23:32.478: E/AndroidRuntime(800): at com.gost.p0191.CountriesActivity.onClick(CountriesActivity.java:121)
08-02 11:23:32.478: E/AndroidRuntime(800): at android.view.View.performClick(View.java:4204)
08-02 11:23:32.478: E/AndroidRuntime(800): at android.view.View$PerformClick.run(View.java:17355)
08-02 11:23:32.478: E/AndroidRuntime(800): at android.os.Handler.handleCallback(Handler.java:725)
08-02 11:23:32.478: E/AndroidRuntime(800): at android.os.Handler.dispatchMessage(Handler.java:92)
08-02 11:23:32.478: E/AndroidRuntime(800): at android.os.Looper.loop(Looper.java:137)
08-02 11:23:32.478: E/AndroidRuntime(800): at android.app.ActivityThread.main(ActivityThread.java:5041)
08-02 11:23:32.478: E/AndroidRuntime(800): at java.lang.reflect.Method.invokeNative(Native Method)
08-02 11:23:32.478: E/AndroidRuntime(800): at java.lang.reflect.Method.invoke(Method.java:511)
08-02 11:23:32.478: E/AndroidRuntime(800): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
08-02 11:23:32.478: E/AndroidRuntime(800): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
08-02 11:23:32.478: E/AndroidRuntime(800): at dalvik.system.NativeStart.main(Native Method)

Знаю что ругается на NullPointerException в строке с switch (rgSort.getCheckedRadioButtonId()) {, но что там не так даже представить не могу. Буду признателен за помощь.

P.S.
Как закинуть текс под спойлер?
P.P.S.
Почему при вкючении подсветки java или java 5 некоторые символы заменяет их HEX-кодами?

Ответить