На этом уроке продожим работу с базой данных 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, но этот класс нигде не прописан. У меня показывает ошибку. Можно ли его импортировать из предыдущего проекта? Или нужно каждый раз его создавать для каждого проекта?