SQLiteOpenHelper
,
который применяется для работы с базами данных в коде приложений.
Во-вторых он уделит определённое внимание инструменту Database
Inspector, инспектору баз данных, встроенному в Android Studio.Что такое SQLite?
SQLite это опенсорсная реляционная СУБД, похожая на MySQL. SQLite входит в состав стандартной библиотеки Android, где реализован движок базы данных, не нуждающийся в применении клиент-серверной архитектуры, не требующий особой настройки, поддерживающий транзакции. Для работы SQLite не нужен сервер баз данных. Всё, что нужно, хранится в обычных файлах. Полноценная БД SQLite, в которой имеется множество таблиц, триггеров, индексов и представлений, содержится в единственном, самом обыкновенном файле. Стандартная поддержка СУБД SQLite имеется во всех мобильных телефонах и в большинстве компьютеров. При этом работа с SQLite не требует решения задач по администрированию или настройке баз данных.
Android-разработчик, для выполнения CRUD-операций из своего приложения, может пользоваться пакетом
android.database.sqlite.SQLiteDatabase
, в котором
реализованы все необходимые API.Класс SQLiteOpenHelper
SQLiteOpenHelper
это класс, встроенный в пакет
android.database.sqlite.SQLiteDatabase
. Это
вспомогательный класс, который отвечает за создание баз данных
SQLite и за управление их версиями. Для того чтобы воспользоваться
возможностями этого класса, нужно создать его подкласс, в котором
надо переопределить два метода onCreate()
и
onUpgrade()
. Этот класс позволяет открывать
существующие базы данных, создавать новые базы данных и обновлять
версии баз данных.Метод onCreate()
Метод
onCreate()
вызывается при создании базы данных.
Он, в процессе жизненного цикла приложения, вызывается лишь один
раз. А именно, его вызов производится при первом обращении к методу
getReadableDatabase()
или
getWritableDatabase()
. Эти методы принадлежат классу
SQLiteOpenHelper
.В следующем примере показано создание экземпляра класса
DatabaseHelper
, являющегося наследником
SQLiteOpenHelper
:
DatabaseHelper dbh = new DatabaseHelper(getApplicationContext());
Вот код конструктора
DatabaseHelper
:
public DatabaseHelper(Context context) {super(context,dbName,null,version);context=this.context;}
Класс
SQLiteOpenHelper
вызывает метод
onCreate()
после создания базы данных и создания
экземпляра класса SQLiteDatabase
. Этот метод,
напомним, вызывается лишь один раз, при создании базы данных:
@Overridepublic void onCreate(SQLiteDatabase db) {try {db.execSQL(CREATE_TABLE);} catch (Exception e) {}}
Метод onUpgrade()
Метод
onUpgrade()
вызывается в тех случаях, когда
нужно обновить версию существующей базы данных:
@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {db.execSQL(DROP_TABLE);onCreate(db);}
Пример
Создадим простое Android-приложение и разберём практический пример работы с классом
SQLiteOpenHelper
. Это приложение,
применяя данный класс, позволит нам добавлять записи о работниках
некоей компании в таблицу Empdata
базы данных
Company.db
.Приложение имеет весьма простой интерфейс, описанный в файле
activity_main.xml
.Интерфейс приложения
Вот содержимое файла
MainActivity.java
:
package www.sqliteopenhelper.sqliteopenhelper;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);EditText edtEmpName = findViewById(R.id.edtName);EditText edtDesig = findViewById(R.id.edtDesig);EditText edtSalary = findViewById(R.id.edtSalary);Button btnSave = findViewById(R.id.btnSave);DatabaseHelper dbh= new DatabaseHelper(getApplicationContext());btnSave.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Employee objEmp = new Employee(edtEmpName.getText().toString(),edtDesig.getText().toString(),Integer.parseInt(edtSalary.getText().toString()));if(dbh.InsertEmployee(objEmp))Toast.makeText(getApplicationContext(),"Record inserted successfully",Toast.LENGTH_LONG).show();elseToast.makeText(getApplicationContext(),"Record not inserted",Toast.LENGTH_LONG).show();}});}}
Вот содержимое
Employee.java
:
package www.sqliteopenhelper.sqliteopenhelper;public class Employee {private String employeeName;private String employeeDesig;private int employeeSalary;public Employee() {}public Employee(String employeeName, String employeeDesig, int employeeSalary) {this.employeeName = employeeName;this.employeeDesig = employeeDesig;this.employeeSalary = employeeSalary;}public String getEmployeeName() {return employeeName;}public String getEmployeeDesig() {return employeeDesig;}public int getEmployeeSalary() {return employeeSalary;}public void setEmployeeName(String employeeName) {this.employeeName = employeeName;}public void setEmployeeDesig(String employeeDesig) {this.employeeDesig = employeeDesig;}public void setEmployeeSalary(int employeeSalary) {this.employeeSalary = employeeSalary;}}
Вот файл
DatabaseHelper.java
:
package www.sqliteopenhelper.sqliteopenhelper;import android.content.ContentValues;import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;public class DatabaseHelper extends SQLiteOpenHelper {public static final int version = 1;public static String dbName="Company.db";public static final String TABLE_NAME ="Empdata";public static final String COL1 = "id";public static final String COL2 = "name";public static final String COL3 = "designation";public static final String COL4 = "salary";private static final String CREATE_TABLE="create table if not exists "+ TABLE_NAME + "(" + COL1 + " INTEGER PRIMARY KEY AUTOINCREMENT,"+COL2+" TEXT NOT NULL,"+ COL3 + " TEXT, " +COL4 + " INTEGER);";private static final String DROP_TABLE = "DROP TABLE IF EXISTS "+ TABLE_NAME;private Context context;public DatabaseHelper(Context context) {super(context,dbName,null,version);context=this.context;}@Overridepublic void onCreate(SQLiteDatabase db) {try {db.execSQL(CREATE_TABLE);} catch (Exception e) {}}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {db.execSQL(DROP_TABLE);onCreate(db);}public boolean InsertEmployee(Employee objEmp){SQLiteDatabase db=this.getWritableDatabase();ContentValues cv = new ContentValues();cv.put(COL2,objEmp.getEmployeeName());cv.put(COL3,objEmp.getEmployeeDesig());cv.put(COL4,objEmp.getEmployeeSalary());long result = db.insert(TABLE_NAME,null,cv);if(result == -1)return false;elsereturn true;}}
В коде
DatabaseHelper.java
видно, что класс
DatabaseHelper
является наследником класса
SQLiteOpenHelper
.После того, как база данных создана, можно приступать к работе с ней. В частности создавать и обновлять поля её таблиц. При решении этих задач можно пользоваться объектом типа
ContentValues
, который позволяет хранить пары
ключ-значение. Именно такие объекты используются для добавления
новых записей в таблицы базы данных (с помощью метода
insert()
объекта SQLiteDatabase
) и для
обновления существующих записей (с помощью метода
update()
).Database Inspector в Android Studio
Инструмент Database Inspector позволяет исследовать базы данных, используемые в приложениях, выполнять запросы к ним, модифицировать их, делая всё это во время работы приложений. Database Inspector имеется в Android Studio начиная с версии 4.1. Этот инструмент особенно полезен при отладке механизмов программ, ответственных за работу с базами данных. Database Inspector работает и с обычной реализацией SQLite, и с библиотеками, построенными на её основе, вроде Room. Database Inspector работает лишь с библиотекой SQLite, входящей в состав операционных систем Android, уровень API которых не ниже 26.
Для того чтобы открыть базу данных в Database Inspector нужно выполнить следующие действия:
- Запустите приложение в эмуляторе или на устройстве, подключённом к компьютеру. На эмуляторе или на устройстве должно присутствовать API не ниже 26 уровня.
- Выполните команду меню
View > Tool Windows > Database Inspector
. - Выберите процесс выполняющегося приложения из выпадающего меню.
- В панели
Databases
появятся записи о базах данных, которые имеются в выбранном приложении. Теперь можно работать с этими базами данных.
Исследование базы данных с помощью Database Inspector
Обратите внимание на то, что есть одна проблема, связанная с аварийным завершением работы программ на эмуляторе Android 11 при подключении к Database Inspector. Если вы с этой проблемой столкнётесь здесь вы можете найти сведения о том, как с ней справиться.
Применяете ли вы SQLite в Android-разработке?