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

Обсуждение уроков
Батька Андройд
Сообщения: 8
Зарегистрирован: 20 авг 2015, 10:17

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

Сообщение Батька Андройд » 29 окт 2015, 09:38

Foenix писал(а):у курсора есть метод, recCount() или как-то так, проверяй вначале на нул, потом на кол-во записей.
Если вы имели в виду getCount, то совсем не понятно как это поможет проверить есть ли запись в БД.

Digetix
Сообщения: 117
Зарегистрирован: 12 окт 2012, 15:31

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

Сообщение Digetix » 12 ноя 2015, 02:12

Как выбрать из базы случайную строку?
Пробовал

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

Cursor c = db.rawQuery("SELECT * FROM table ORDER BY RANDOM() LIMIT 1", null);
Работает, но только в sqlitebrowser, в приложении падает с NullPointerException

SERJ_NAVII
Сообщения: 2
Зарегистрирован: 29 фев 2016, 10:52

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

Сообщение SERJ_NAVII » 29 фев 2016, 10:59

public Cursor sortRow() {
String where = null;
String[] columns = {KEY_DATE, "sum(" + KEY_VALUE + ") as" + KEY_VALUE};
Cursor c = db.query(true, DATABASE_TABLE, columns, where, null, KEY_DATE, null, null, null);
if (c != null) {
c.moveToFirst();
}
return c;
}

Помогите плиз. Что я неправильно делаю?

SERJ_NAVII
Сообщения: 2
Зарегистрирован: 29 фев 2016, 10:52

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

Сообщение SERJ_NAVII » 29 фев 2016, 11:21

private void putSomeListViewForDays(){
Cursor cursor = myDB.sortRow();

String[] from = {DBAdapter.KEY_DATE, DBAdapter.KEY_VALUE};
int[] to = {R.id.textView, R.id.textView2};

SimpleCursorAdapter simpleCursorAdapter=new SimpleCursorAdapter(this, R.layout.some_item_layout, cursor, from, to);
lvShowDays.setAdapter(simpleCursorAdapter);
}

Код отображение.

Droidoc
Сообщения: 7
Зарегистрирован: 23 дек 2016, 07:52

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

Сообщение Droidoc » 23 дек 2016, 08:38

При попытке использовать query вылетает ошибка:

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

Failed to get GED Log Buf, err(0)
12-23 08:05:24.461 32630 32630 D   mark                                         TABLE create table myTab (id integer primary key autoincrement,forText text,forNums integer); created
12-23 08:06:43.786 32630 32630 E   SQLiteLog                                    (1) near "FROM": syntax error
12-23 08:06:43.794 32630 32630 E   AndroidRuntime                               FATAL EXCEPTION: main
12-23 08:06:43.794 32630 32630 E   AndroidRuntime                               Process: com.mycompany.myapp, PID: 32630
12-23 08:06:43.794 32630 32630 E   AndroidRuntime                               android.database.sqlite.SQLiteException: near "FROM": syntax error (code 1): , while compiling: SELECT  FROM myTab
12-23 08:06:43.794 32630 32630 E   AndroidRuntime                               at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
12-23 08:06:43.794 32630 32630 E   AndroidRuntime                               at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:898)
12-23 08:06:43.794 32630 32630 E   AndroidRuntime                               at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:509)
12-23 08:06:43.794 32630 32630 E   AndroidRuntime                               at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
12-23 08:06:43.794 32630 32630 E   AndroidRuntime                               at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
12-23 08:06:43.794 32630 32630 E   AndroidRuntime                               at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37)
12-23 08:06:43.794 32630 32630 E   AndroidRuntime                               at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44)
12-23 08:06:43.794 32630 32630 E   AndroidRuntime                               at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1346)
12-23 08:06:43.794 32630 32630 E   AndroidRuntime                               at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1193)
12-23 08:06:43.794 32630 32630 E   AndroidRuntime                               at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1064)
12-23 08:06:43.794 32630 32630 E   AndroidRuntime                               at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1232)
12-23 08:06:43.794 32630 32630 E   AndroidRuntime                               at com.mycompany.myapp.MainActivity.onClick(MainActivity.java:130)
12-23 08:06:43.794 32630 32630 E   AndroidRuntime                               at android.view.View.performClick(View.java:4848)
12-23 08:06:43.794 32630 32630 E   AndroidRuntime                               at android.view.View$PerformClick.run(View.java:20262)
12-23 08:06:43.794 32630 32630 E   AndroidRuntime                               at android.os.Handler.handleCallback(Handler.java:815)
12-23 08:06:43.794 32630 32630 E   AndroidRuntime                               at android.os.Handler.dispatchMessage(Handler.java:104)
12-23 08:06:43.794 32630 32630 E   AndroidRuntime                               at android.os.Looper.loop(Looper.java:194)
12-23 08:06:43.794 32630 32630 E   AndroidRuntime                               at android.app.ActivityThread.main(ActivityThread.java:5631)
12-23 08:06:43.794 32630 32630 E   AndroidRuntime                               at java.lang.reflect.Method.invoke(Native Method)
12-23 08:06:43.794 32630 32630 E   AndroidRuntime                               at java.lang.reflect.Method.invoke(Method.java:372)
12-23 08:06:43.794 32630 32630 E   AndroidRuntime                               at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:959)
12-23 08:06:43.794 32630 32630 E   AndroidRuntime                               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:754)
MainActivity.java

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

[syntax=java5]
package com.mycompany.myapp;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.content.*;
import android.util.*;
import android.widget.*;
import android.webkit.*;
import android.net.*;
import android.database.sqlite.*;
import android.database.*;

public class MainActivity extends Activity  implements OnClickListener
{

	final String tag="mark";
	Tabuild Tad;
	String tapamS,nameS,colS,datS,qolS[],selS,argS[],havS,gruS,ordS;
	Button creBUT,inBUT,upBUT,delBUT,clerBUT,qurBUT;
	EditText tapamET,namET,colET,datET,qolET,selET,argET,havET,gruET,ordET;
	
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		Tad = new Tabuild(this);

		creBUT = (Button)findViewById(R.id.cretab);
		inBUT = (Button)findViewById(R.id.insert);
		upBUT = (Button)findViewById(R.id.update);
		delBUT = (Button)findViewById(R.id.delete);
		clerBUT = (Button)findViewById(R.id.clear);
		qurBUT = (Button)findViewById(R.id.query);

		creBUT.setOnClickListener(this);
		inBUT.setOnClickListener(this);
		upBUT.setOnClickListener(this);
		delBUT.setOnClickListener(this);
		clerBUT.setOnClickListener(this);
		qurBUT.setOnClickListener(this);

	}

	public void onClick(View p1)
	{
		qolS=new String[1];
		argS=new String[1];
		tapamS=nameS=colS=datS=qolS[0]=selS=argS[0]=havS=gruS=ordS=null;
		
		tapamET = (EditText)findViewById(R.id.tabpam);
		namET = (EditText)findViewById(R.id.TabNameET);
		colET = (EditText)findViewById(R.id.colname);
		datET = (EditText)findViewById(R.id.data);
		qolET = (EditText)findViewById(R.id.colms);
		selET = (EditText)findViewById(R.id.select);
		argET = (EditText)findViewById(R.id.selargs);
		havET = (EditText)findViewById(R.id.have);
		gruET = (EditText)findViewById(R.id.group);
		ordET = (EditText)findViewById(R.id.order);
		
		tapamS = tapamET.getText().toString();
		nameS = namET.getText().toString();
		colS = colET.getText().toString();
		datS = datET.getText().toString();
		qolS[0] = qolET.getText().toString();
		selS = selET.getText().toString();
		argS[0] = argET.getText().toString();
		havS = havET.getText().toString();
		gruS = gruET.getText().toString();
		ordS = ordET.getText().toString();

		ContentValues CV=new ContentValues();
		Cursor CSR;
		SQLiteDatabase sqlid=Tad.getWritableDatabase();

		switch (p1.getId())
		{
			case R.id.cretab: 
				{
					sqlid.execSQL(tapamS);
					Log.d(tag, "TABLE " + tapamS + " created");
					Toast.makeText(this, "new table created", Toast.LENGTH_SHORT).show();
				}
				break;

			case R.id.insert:
				{
					CV.put(colS, datS);
					sqlid.insert(nameS, null, CV);
					Toast.makeText(this,datS+" in "+colS+" inserted",Toast.LENGTH_SHORT).show();
				}
				break;

			case R.id.update:
				{
					CV.put(colS, datS);
					sqlid.update(nameS, CV, selS, argS);
					
				}
				break;

			case R.id.delete:
				{
					sqlid.delete(nameS, selS, argS);
					
				}
				break;

			case R.id.clear:
				{
					tapamET.setText(null);
					namET.setText( null);
					colET.setText( null);
					datET.setText( null);
					qolET.setText( null);
					selET.setText( null);
					argET.setText( null);
					havET.setText( null);
					gruET.setText( null);
					ordET.setText( null);
				}
				break;

			case R.id.query:
				{
					String res="--";
					CSR = sqlid.query(nameS, qolS, selS, argS, havS, gruS, ordS);
					if (CSR.moveToFirst())
					{
						String colnam[]= CSR.getColumnNames();
						for (String cn:colnam)
						{
							res += cn + "--";
						}
						Log.d(tag, res);
						res = "--";
						do
						{	
							for (String cn:colnam)
							{
								int colind=CSR.getColumnIndex(cn);
								if((CSR.getType(colind))==CSR.FIELD_TYPE_STRING)
									res += (CSR.getString(colind)) + "--";
								else if((CSR.getType(colind))==CSR.FIELD_TYPE_INTEGER)
									res+=(CSR.getInt(colind))+"--";
							}
							Log.d(tag, res);
							res = "--";
						}
						while(CSR.moveToNext());
					}
					else Toast.makeText(this,"CSR is empty",Toast.LENGTH_SHORT).show();
					CSR.close();
					Tad.close();
				}
				break;
		}
	}
	
	class Tabuild extends SQLiteOpenHelper
	{
		Tabuild(Context Cxt)
		{
			super(Cxt, "DaB", null, 1);
		}

		public void onCreate(SQLiteDatabase p1)
		{
		}
		public void onUpgrade(SQLiteDatabase p1, int p2, int p3)
		{
		}
	}
}
[/syntax]
main.xml

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

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical">

	<LinearLayout
		android:layout_width="fill_parent"
		android:layout_height="wrap_content"
		android:orientation="horizontal">
		
		<Button
			android:layout_width="wrap_content"
			android:layout_height="wrap_content"
			android:text="create"
			android:id="@+id/cretab"/>
		
	   <EditText
		    android:layout_width="match_parent"
		    android:layout_height="wrap_content"
		    android:id="@+id/tabpam"/>
 
	</LinearLayout>
	
<TableRow
	android:layout_width="match_parent"
	android:layout_height="match_parent">
	
	<TableLayout
		android:layout_width="wrap_content"
		android:layout_height="match_parent">
			
		<TextView
			android:text="TabName:"
			android:layout_marginTop="10dp"
			android:layout_height="wrap_content"
			android:layout_width="wrap_content"/>
			
		<EditText
			android:id="@+id/TabNameET"
			android:minWidth="100dp"
			android:layout_height="wrap_content"
			android:layout_width="wrap_content"/>
			
		<TextView
			android:text="column (cv): "
			android:layout_marginTop="10dp"
			android:layout_height="wrap_content"
			android:layout_width="wrap_content"/>
			
		 <EditText
			android:id="@+id/colname"
			android:minWidth="100dp"
			android:layout_height="wrap_content"
			android:layout_width="wrap_content"/>
			
		<TextView
			android:text="data (cv): "
			android:layout_marginTop="10dp"
			android:layout_height="wrap_content"
			android:layout_width="wrap_content"/>

		<EditText
			android:id="@+id/data"
			android:minWidth="100dp"
			android:layout_height="wrap_content"
			android:layout_width="wrap_content"/>
			
		<Button
			android:layout_marginTop="10dp"
			android:text="insert"
			android:id="@+id/insert"
			android:layout_height="wrap_content"
			android:layout_width="wrap_content"/>
		
		<Button
			android:layout_marginTop="10dp"
			android:text="update"
			android:id="@+id/update"
			android:layout_height="wrap_content"
			android:layout_width="wrap_content"/>
		
	</TableLayout>
	
	<TableLayout
		android:layout_width="wrap_content"
		android:layout_height="match_parent">
		
		<TextView
			android:text="columns: "
			android:layout_marginTop="10dp"
			android:layout_height="wrap_content"
			android:layout_width="wrap_content"/>

		<EditText
			android:id="@+id/colms"
			android:minWidth="100dp"
			android:layout_height="wrap_content"
			android:layout_width="wrap_content"/>
		
		<TextView
			android:text="selection: "
			android:layout_marginTop="10dp"
			android:layout_height="wrap_content"
			android:layout_width="wrap_content"/>

		<EditText
			android:id="@+id/select"
			android:minWidth="100dp"
			android:layout_height="wrap_content"
			android:layout_width="wrap_content"/>
		
		<TextView
			android:text="ARGS[]: "
			android:layout_marginTop="10dp"
			android:layout_height="wrap_content"
			android:layout_width="wrap_content"/>

		<EditText
			android:id="@+id/selargs"
			android:minWidth="100dp"
			android:layout_height="wrap_content"
			android:layout_width="wrap_content"/>
		
		<Button
			android:layout_marginTop="10dp"
			android:text="delete"
			android:id="@+id/delete"
			android:layout_height="wrap_content"
			android:layout_width="wrap_content"/>
		
		<Button
			android:layout_marginTop="10dp"
			android:text="clear"
			android:id="@+id/clear"
			android:layout_height="wrap_content"
			android:layout_width="wrap_content"/>
		
	</TableLayout>
	
	<TableLayout
		android:layout_width="wrap_content"
		android:layout_height="match_parent">
		
		<TextView
			android:text="having: "
			android:layout_marginTop="10dp"
			android:layout_height="wrap_content"
			android:layout_width="wrap_content"/>

		<EditText
			android:id="@+id/have"
			android:minWidth="100dp"
			android:layout_height="wrap_content"
			android:layout_width="wrap_content"/>
		
		<TextView
			android:text="group: "
			android:layout_marginTop="10dp"
			android:layout_height="wrap_content"
			android:layout_width="wrap_content"/>

		<EditText
			android:id="@+id/group"
			android:minWidth="100dp"
			android:layout_height="wrap_content"
			android:layout_width="wrap_content"/>
		
		<TextView
			android:text="order: "
			android:layout_marginTop="10dp"
			android:layout_height="wrap_content"
			android:layout_width="wrap_content"/>

		<EditText
			android:id="@+id/order"
			android:minWidth="100dp"
			android:layout_height="wrap_content"
			android:layout_width="wrap_content"/>
		
		<Button
			android:layout_marginTop="10dp"
			android:text="query"
			android:id="@+id/query"
			android:layout_height="wrap_content"
			android:layout_width="wrap_content"/>
		
	</TableLayout>
			
</TableRow>

</LinearLayout>
При вводе аргументов для query в коде , например: query(myTab,null,null,null,null,null,null) -всё работает , но если брать аргументы из полей ввода , при работе самого приложения возникает ошибка -подозреваю что дело в массивах columns и selectARGS , так как если значения для них в параметрах query выставить null прямо в коде , то значения для остальных параметров нормально берутся из полей и программа работает

ElDog
Сообщения: 2
Зарегистрирован: 21 ноя 2017, 19:44

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

Сообщение ElDog » 08 янв 2018, 12:31

ermek6 писал(а):Вопрос по организации кода.
Зачем получать курсор в каждом кейсе. Ведь переменные то мы и так установили все в null. Можно же один раз курсор получить после switch. Или же для этого были другие причины???
насколько я понял из своей небольшой практики, курсор работает с данными, которые существовали в таблице на момент создания курсора. конкретно в этом примере в процессе работы программы данные не меняются, но если это потребуется, то измененные данные не попадут в область охвата курсором, созданным до изменения данных. Как видите, по стилю написания я еще новичок поэтому поправьте. если не так. Заранее благодарен

Vsiniak
Сообщения: 8
Зарегистрирован: 03 авг 2020, 10:30

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

Сообщение Vsiniak » 17 авг 2020, 11:20

Друзья, ниже привел аналогии кода в данном уроке с SQL.
- Columns – список полей
Принимает:

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

String[] columns = new String[]{sFunc}
db.query("mytable", columns, null, null, null, null, null);
sFunc – функция SQL. Равносильно записи
SELECT sFunc FROM mytable
- Selection – строка условие WHERE

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

String selection = null;
String[] selectionArgs = null;

selection = "people > ?";
selectionArgs = new String[] { sPeople };
cursor1 = db.query("mytable", null, selection, selectionArgs, null, null, null);
SELECT * FROM mytable WHERE people > selectionArgs
selectionArgs – массив аргументов для selection(используется тогда, когда есть в selection знаки «?»)
- groupBy – группировка

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

columns = new String[] { "region", "sum(people) as people" };
groupBy = "region";
cursor1 = db.query("mytable", columns, null, null, groupBy, null, null);
SELECT region, sum(people) as people FROM mytable GROUP BY region
Группирует по столбцу регион, суммирует значение столбца people.
- having – использование условия для агрегатных функций(SUM, MIN, MAX, COUNT)

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

columns = new String[] { "region", "sum(people) as people" };
groupBy = "region";
having = "sum(people) > " + sRegionPeople;
cursor1 = db.query("mytable", columns, null, null, groupBy, having, null);
SELECT region, sum(people) as people FROM mytable GROUP BY region HAVING SUM(people) > sRegionPeople
- orderBy – сортировка по определенному столбцу

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

orderBy = "name";
cursor1 = db.query("mytable", null, null, null, null, null, orderBy);
SELECT * FROM mytable ORDER BY name
Обращайтесь в ЛС. Помогу.

Ответить