На этом уроке продожим работу с базой данных SQLite в Android. Создадим приложение, на примере которого покажем, как делать группировку, сортировку и выборку данных по условию в базе данных SQLite с помощью метода query с параметрами columns, selection, selectionArgs, groupBy, having, orderBy.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Справочник стран"
android:textSize="14sp"
android:gravity="center_horizontal"
android:layout_marginBottom="5dp"
android:layout_marginTop="5dp">
</TextView>
<Button
android:id="@+id/btnAll"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Все записи"
android:layout_marginTop="5dp">
</Button>
<LinearLayout
android:id="@+id/linearLayout1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp">
<Button
android:id="@+id/btnFunc"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Функция">
</Button>
<EditText
android:id="@+id/etFunc"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1">
<requestFocus>
</requestFocus>
</EditText>
</LinearLayout>
<LinearLayout
android:id="@+id/linearLayout2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp">
<Button
android:id="@+id/btnPeople"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Население >">
</Button>
<EditText
android:id="@+id/etPeople"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:inputType="number">
</EditText>
</LinearLayout>
<Button
android:id="@+id/btnGroup"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Население по региону"
android:layout_marginTop="5dp">
</Button>
<LinearLayout
android:id="@+id/linearLayout4"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp">
<Button
android:id="@+id/btnHaving"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Население по региону >">
</Button>
<EditText
android:id="@+id/etRegionPeople"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:inputType="number">
</EditText>
</LinearLayout>
<LinearLayout
android:id="@+id/linearLayout3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp">
<Button
android:id="@+id/btnSort"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Сортировка">
</Button>
<RadioGroup
android:id="@+id/rgSort"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<RadioButton
android:id="@+id/rName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="true"
android:text="Наименование">
</RadioButton>
<RadioButton
android:id="@+id/rPeople"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Население">
</RadioButton>
<RadioButton
android:id="@+id/rRegion"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Регион">
</RadioButton>
</RadioGroup>
</LinearLayout>
</LinearLayout>
package ...
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.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RadioGroup;
public class MainActivity extends AppCompatActivity implements View.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;
public 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));
}
}
c.close();
dbHelper.close();
// эмулируем нажатие кнопки btnAll
onClick(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());
}
c.close();
} else
Log.d(LOG_TAG, "Cursor is null");
dbHelper.close();
}
class DBHelper extends SQLiteOpenHelper {
public DBHelper(Context context) {
// конструктор суперкласса
super(context, "myDB", null, 1);
}
public void onCreate(SQLiteDatabase db) {
Log.d(LOG_TAG, "--- onCreate database ---");
// создаем таблицу с полями
db.execSQL("create table mytable ("
+ "id integer primary key autoincrement," + "name text,"
+ "people integer," + "region text" + ");");
}
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
}
Извините за невнимательность.. Дошел до конца кода — нашел нужный класс))
Здравствуйте. При объявлении переменных класса, создаем переменную класса DBHelper, но этот класс нигде не прописан. У меня показывает ошибку. Можно ли его импортировать из предыдущего проекта? Или нужно каждый раз его создавать для каждого проекта?