На этом уроке поговорим о транзакциях в БД, и о том, как с помощью транзакций и SQLiteStatment ускорить работу с базой данных SQLite в android.

Что такое транзакции в БД SqLite? В нескольких словах, это работа с данными по принципу —  «все или ничего». Например, если при сохранении в базу большого объема данных произошел сбой, и операция не закончилась успешно, сохранение или изменение данных в БД будет отменено, и все останется как было.
Т.е. либо транзакция выполняется целиком и переводит базу данных из одного целостного состояния в другое целостное состояние, либо, если по каким-либо причинам, одно из действий транзакции невыполнимо, или произошло какое-либо нарушение работы системы, база данных возвращается в исходное состояние, которое было до начала транзакции (происходит откат транзакции).
По умолчанию каждая инструкция SQL выполняется в собственной транзакции — это типичное поведение для базы данных SQL и SQLite не является исключением.
Но вы можете определить собственные границы транзакции, которые будут включать больше, чем одна инструкция, и это повышает производительность, поскольку одна большая транзакция выполняется  гораздо быстрее, чем множество маленьких.

Семантика транзакций БД SqLite проста. Вы начинаете новую транзакцию путем вызова метода SQLiteDatabase.beginTransaction(). После того, как вы вставите все записи успешно, вызовите SQLiteDatabase. setTransactionSuccessful(), а затем завершаете транзакцию с SQLiteException.endTransaction(). Если что-то пойдет не так в одной из вставок, выпадет исключение SQLException,  и будет выполнен откат всех предыдущих вставок, поскольку не произойдет вызов метода SQLiteDatabase.setTransactionSuccessful().
Использование транзакций не только делает работу с БД более безопасной, но и существенно ускоряет ее.   Напишем небольшое приложение, которое поможет убедиться в этом.
Приложение будет создавать 1000 записей программно, выполнять  вставку записей в таблицу БД, и отображать длительность операции на экране.
Создаем новый проект с использованием шаблона Empty Activity.
В макете главного экрана такая структура:

Текстовое поле, в которое мы будем выводить время длительности втавки данных в БД.
И кнопка, по нажатию которой будет происходить вставка данных.

В файле MainActivity.java реализуем интерфейс слушателя нажатия кнопки.
Далее добавим константы имени БД  и заголовка таблицы, переменную класса SQLiteDatabase.
Объявим кнопку и текстовое поле.
Найдем экранные компоненты по id, присвоим слушатель кнопке.
Теперь напишем метод initDB в котором будем создавать БД. Метод openOrCreateDatabase создает БД или открывает, если она уже создана.
Затем выполняем запрос на создание таблицы с темя столбцами, где два столбца будут хранить целые числа, а третий столбец — результат их произведения.
Также добавим метод очистки всех полей таблицы.
Будем вызывать метод initDB  в onCreate.
Теперь заполним метод onClick — сначала вызываем метод очистки таблицы, затем создаем переменную startTime, которая будет хранить  приблизительный момент нажатия кнопки.
Здесь вызываем метод добавления записей в БД. Все будет происходить в основном потоке, и процесс вставки записей будет занимать какое-то время.
После чего мы снова создаем переменную, в которую передаем разницу между текущим временем и моментом нажатия кнопки.
И затем выводим результат в текстовое поле, преобразовав время в строковый формат.
Теперь рассмотрим код метода вставки данных в БД.  Ничего нового здесь по сравнению с прошлыми уроками нет.
В цикле создаем экземпляр класса ContentValues, добавляем данные в столбцы методом put — первое значение, второе значение, и их произведение. Метод insert записывает данные в таблицу.
Теперь запустим приложение в эмуляторе.
Нажимаем кнопку, наше приложение зависает на несколько секунд, а затем сообщает, что операция вставки занимает 5071 миллисекунду.
Добавим методы транзакции в метод insertRecords().

Метод beginTransaction() начинает транзакцию, метод setTransactionSuccessful() вызовется по ее окончании. Его и весь блок цикла обернем в конструкцию try> finally, для этого выделяем код и нажимаем клавиши Ctrl+Alt+T. Выбираем нужное в списке. Завершаем транзакцию методом endTransaction().
Запустим приложение и нажмем кнопку вставки.
C применением транзакций длительность операции вставки сократилась до 115 ms — это в 44 раза быстрее!
Но это еще не все — результат можно улучшить, если использовать класс SQLiteStatement.
Перепишем метод insertRecords:

Создаем строковую переменную, которая будет хранить sql инструкцию. Далее создаем экземпляр SQLiteStatement, которому передаем скомпилированный SQL запрос.
Меняем код в теле цикла на такой: сначала метод clearBindings() очищает все текущие привязки, методы bindLong привязывают значения данных к столбцам, а метод execute выполняет вставку данных.
Запускаем приложение, жмем кнопку вставки.
Результат — 42 ms, то есть мы ускорили операцию вставки данных еще почти в 3 раза.
Как видите, использование класса SQLiteStatment в сочетании с транзакциями позволяет существенно ускорить  вставку данных в БД.

<<Предыдущий урок     Следующий урок>>

Урок 38. Транзакции в SQLite. Использование SQLiteStatment обновлено: Июль 3, 2016 автором: admin

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*
*
Website