Применение SQLiteOpenHelper и Database Inspector в Android-разработке
Автор статьи, перевод которой мы публикуем сегодня, хочет рассказать об использовании баз данных SQLite в Android-разработке. В частности — он коснётся тут двух вопросов. Во-первых — речь пойдёт о классе 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)
Класс SQLiteOpenHelper вызывает метод onCreate() после создания базы данных и создания экземпляра класса SQLiteDatabase . Этот метод, напомним, вызывается лишь один раз, при создании базы данных:
@Override public void onCreate(SQLiteDatabase db) < try < db.execSQL(CREATE_TABLE); >catch (Exception e) < >>
▍Метод onUpgrade()
Метод onUpgrade() вызывается в тех случаях, когда нужно обновить версию существующей базы данных:
@Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
▍Пример
Создадим простое 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 < @Override protected 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() < @Override public 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(); else Toast.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; >@Override public void onCreate(SQLiteDatabase db) < try < db.execSQL(CREATE_TABLE); >catch (Exception e) < >> @Override public 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; else return 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-разработке?
Какой движок баз данных используется в ос android
Warning: mysqli_connect(): (HY000/1040): Too many connections in /home/c/co37471/eljob/public_html/core/main/Msql.php on line 49
Warning: mysqli_connect(): (HY000/1040): Too many connections in /home/c/co37471/eljob/public_html/core/main/Msql.php on line 53
Warning: mysqli_connect(): (HY000/1040): Too many connections in /home/c/co37471/eljob/public_html/core/main/Msql.php on line 53
Warning: mysqli_connect(): (HY000/1040): Too many connections in /home/c/co37471/eljob/public_html/core/main/Msql.php on line 53
Some mysqli shit happened: 1040 Too many connections
Какой движок баз данных используется в ОС Android?
Какой язык разметки используется для описания иерархии компонентов графического пользовательского интерфейса Android-приложения?
Для решения каких задач в Android используется класс MediaPlayer?
Для решения каких задач в Android используется класс MediaRecorder ?
Ядро какой операционной системы использовалось в качестве базы для ОС Android?
Какой элемент в архитектуре Android служит уровнем абстракции между аппаратным обеспечением и программным стеком?
Какой вид компоновки определяет табличный способ расположения компонентов графического интерфейса пользователя в приложениях под Android?
Какие библиотеки позволяют использовать возможности, появившиеся в какой-то версии ОС Android, на более ранних версиях платформы?
Какой компонент архитектуры Android позволяет любому приложению использовать уже реализованные возможности других приложений, к которым разрешен доступ?
Какой движок баз данных используется в ос android
С какой целью инструмент Intel* Hardware Accelerated Execution Manager (Intel* HAXM) используется в среде разработки Intel* Beacon Mountain?
(Отметьте один правильный вариант ответа.)
Вариант 1 для ускорения работы эмулятора в среде разработки
Вариант 2 для эффективного распараллеливания С++ мобильных приложений
Вариант 3 для оптимизированной обработки данных и изображений
Вариант 4 для оптимизации загрузки системы при использовании процедур OpenGL
С какой целью инструмент Intel* Graphics Performance Analyzers (Intel* GPA) System Analyzer используется в среде разработки Intel* Beacon Mountain?
(Отметьте один правильный вариант ответа.)
Вариант 1 позволить разработчикам эффективно распараллелить С++ мобильные приложения
Вариант 2 позволить разработчикам оптимизировать загруженность системы при использовании процедур OpenGL
Вариант 3 для ускорения работы эмулятора в среде разработки
Вариант 4 для оптимизированной обработки данных и изображений
Тестирование на реальных устройствах приложений, разработанных в Intel XDK
(Отметьте один правильный вариант ответа.)
Вариант 1 невозможно
Вариант 2 можно проводить, установив на устройство специальную программу или собрав проект и установив результат сборки на устройство
Вариант 3 можно проводить, установив на устройство специальную программу
Вариант 4 можно проводить, собрав проект и установив результат сборки на устройство
Эмулятор среды разработки Intel XDK:
(Отметьте один правильный вариант ответа.)
Вариант 1 не требует больших системных ресурсов
Вариант 2 позволяет проверить работу приложений, использующих акселерометр
Вариант 3 позволяет моделировать исполнение приложение на ряде устройств
Вариант 4 все варианты ответа верны
Intel XDK поддерживает разработку под:
(Отметьте один правильный вариант ответа.)
Вариант 1 JavaFX Mobile
Вариант 2 Apple iOS, BlackBerry OS
Вариант 3 Android, Apple iOS, Microsoft Windows 8, Tizen
Вариант 4 MtkOS, Symbian OS, Microsoft Windows 8
Какая графическая библиотека входит в набор библиотек ОС Android?
(Отметьте один правильный вариант ответа.)
Вариант 1 OpenCV
Вариант 2 DirectX
Вариант 3 Open GL
Вариант 4 OpenCL
Приложения, не имеющие GUI и выполняющиеся в фоновом режиме — это
(Отметьте один правильный вариант ответа.)
Вариант 1 Intents
Вариант 2 Content Providers
Вариант 3 Activities
Вариант 4 Services
Удобное средство обмена между двумя NFC-устройствами:
(Отметьте один правильный вариант ответа.)
Вариант 1 Wi-Fi Direct
Вариант 2 Dalvik
Вариант 3 AndroidBeam
Вариант 4 Bluetooth
Преимуществом эмуляторов является:
(Отметьте один правильный вариант ответа.)
Вариант 1 невозможность полноценной отладки
Вариант 2 необходимость дополнительных системных ресурсов
Вариант 3 низкая стоимость
Вариант 4 медленный запуск
Фоновые приложения .
(Отметьте один правильный вариант ответа.)
Вариант 1 после настройки не предполагают взаимодействия с пользователем, большую часть времени находятся и работают в скрытом состоянии
Вариант 2 небольшие приложения, отображаемые в виде графического объекта на рабочем столе
Вариант 3 выполняют свои функции и когда видимы на экране, и когда скрыты другими приложениями
Вариант 4 большую часть времени работают в фоновом режиме, однако допускают взаимодействие с пользователем и после настройки
Какая папка в структуре Android-приложения содержит файлы с исходным кодом на языке Java?
(Отметьте один правильный вариант ответа.)
Вариант 1 gen
Вариант 2 src
Вариант 3 bin
Вариант 4 res
Приложение какого вида имеет смысл использовать для отображения динамической информации, такой как заряд батареи, прогноз погоды, дата и время?
(Отметьте один правильный вариант ответа.)
Вариант 1 фоновое приложение
Вариант 2 приложение переднего плана
Вариант 3 виджет
Вариант 4 смешанное приложение
Что находится в папке gen?
(Отметьте один правильный вариант ответа.)
Вариант 1 ресурсы приложения
Вариант 2 аудио файлы
Вариант 3 изображения
Вариант 4 автоматически сгенерированные java-файлы
Каждый приемник широковещательных сообщений является наследником класса .
(Отметьте один правильный вариант ответа.)
Вариант 1 ContentProvider
Вариант 2 BroadcastReceiver
Вариант 3 ViewReceiver
Вариант 4 IntentReceiver
Выберите верные утверждения относительно объекта-намерения (Intent).
(Ответ считается верным, если отмечены все правильные варианты ответов.)
Вариант 1 представляет собой структуру данных, содержащую описание операции, которая должна быть выполнена, и обычно используется для запуска активности или сервиса
Вариант 2 используются для передачи сообщений между основными компонентами приложений
Вариант 3 используется для получения инструкций от пользователя
Вариант 4 используется для передачи сообщений пользователю
Какие методы может использовать активность для запуска сервиса?
(Ответ считается верным, если отмечены все правильные варианты ответов.)
Вариант 1 bindService()
Вариант 2 openService()
Вариант 3 startService()
Вариант 4 createService()
Выберите верную последовательность действий, необходимых для создания в приложении контент-провайдера.
(Отметьте один правильный вариант ответа.)
Вариант 1 Проектирование способа хранения данных; Создание класса-наследника от класса ContentProvider; Определение строки авторизации провайдера, URI для его строк и имен столбцов
Вариант 2 Создание класса наследника от класса ContentProvider; Заполнение контент-провайдера данными; Определение способа работы с данными
Вариант 3 Проектирование способа хранения данных; Определение способа организации данных; Определение способа работы с данными
Вариант 4 Создание класса наследника от класса ContentProvider; Определение способа организации данных; Заполнение контент-провайдера данными