Многие приложения, которые вы устанавливаете на свои устройства хранят данные на вашем телефоне или планшете.
Например Контакты хранят данные о ваших контактах: имя, номер телефона и тп.
Сохраненные данные являются гарантом того, что пользовательский контент не будет утерян при отсутствии интернета или закрытии приложения.
SQLite - это распространенный способ сохранения данных, предоставляемый Android SDK для приложений Android. SQLite предоставляет реляционную базу данных, которая позволяет вам представлять данные аналогично тому, как вы структурируете данные с помощью классов Kotlin.
Реляционные базы данных
- База данных состоит из таблиц.
- Базу данных можно назвать реляционной, когда она моделирует отношения между таблицами (у библиотеки может быть несколько читателей)
- Таблица определяет группу данных которую вы хотите описать: Читатель, Библиотека, Библиотекарь (по сути название класса)
- По столбцам описываются свойства объектов (поля класса: возраст читателя, имя...)
- По строкам располагаются объекты класса (читатели например)
- В реляционной базе данных каждая таблица содержит уникальный индификатор строк, где каждый объект имеет уникальное значение (т.е. ни в одной из строк таблицы нет похожего значения), это значение - первичный ключ
- Когда одна таблица (а их как я написал в базе данных несколько), ссылается на ключ другой таблицы. Это называется внешним ключом (наличие внешнего ключа, говорит о том, что БД реляционная)
Возвращаемся к SQLite
SQLite - это реляционная база данных или компактная библиотека, управляющая реляционными базами данных при помощи языка SQL.
Запрос к базе данных
Чтобы считать данные из БД мы используем SELECT за которым следует имя столбца, за которым следует название таблицы и заканчивается все на точку с запятой " ; "
- SELECT "column name" FROM "table name" ;
P.S. можно выбирать любое количество колонок в запросе через запятую, если не написать ни одной и поставить * :
- SELECT * FROM "table name" ;
то SELECT вернет всю таблицу
Агрегатные функции
По сути это функции над столбцами в БД:
- COUNT(): Возвращает общее количество строк, соответствующих запросу;
- SUM(): Возвращает сумму значений для всех строк в выбранном столбце;
- AVG(): Возвращает среднее значение —average— всех значений в выбранном столбце;
- MIN(): Возвращает наименьшее значение в выбранном столбце;
- MAX(): Возвращает наибольшее значение в выбранном столбце.
Наш запрос будет выглядеть следующим образом:
- SELECT AGGREGATE FUNCTION("column name") FROM "table name" ;
Так же имеется ключевое слово DISTINCT оно позволяет нам убрать дубликаты и ставится перед названием колонки:
- SELECT AGGREGATE FUNCTION( DISTINCT "column name") FROM "table name";
Используй WHERE
Этот запрос выполняет логическую проверку для каждой выбранной строки (для каждого объекта); если проверка возвращает true, она включает строку в результат запроса. Строки, для которых запрос возвращает false, не включаются в результат.
Ну те пишите какой-нибудь запрос по типу:
SELECT "column name" FROM "table name"
WHERE "condition";
SELECT "age" FROM "students"
WHERE name = 'Ivan' ;
И мы получим возраста всех студентов с именем Иван.
- = знак сравнения
- != знак неравенства
- >,<,<=,>= нуууу, думаю и так понятно
Так же конструкция WHERE интересна тем, что мы можем в нее добавить еще одно условие. Ну т.е. допустим вывести возраст студента, когда у нас студента зовут Иван и у него белые волосы.
SELECT "age" FROM "students"
WHERE name = 'Ivan' AND hairColour = 'white' ;
И SQLite выведет нам возраст всех белоголовых иванов из таблицы "студенты".
Всего то добавляем AND между условиями.
Или вместо AND можно использовать OR.
Но при использовании OR мы получим всех студентов с именами Иван и всех белоголовых студентов.
Так же иногда бывает удобно просто исключить какое-то поле допусти хотим получить возраст всех НЕ беловолосых студентов. (для этого юзаем NOT)
SELECT "age" FROM "students"
WHERE NOT hairColour = 'white' ;
- AND - когда хотим чтобы выполнялось И первое И второе условия
- OR - когда хотим чтобы выполнялось ИЛИ первое ИЛИ второе условия
- NOT - когда не хотим чтобы выполнялось какое-либо условие
Поиск по тексту при помощи LIKE
Все просто эта вещь очень похожа на ctrl+f, но если в случае ctrl+f мы ищем необходимую нам строку по всему тексту, то в случае запроса мы это делаем только в рамках определенного свойства объекта (колонки).
SELECT "column name" FROM "table name"
WHERE "column name" LIKE "search string";
Примерчик
SELECT * FROM students
WHERE name LIKE '%Наливкин';
Что за процентики ыыыыыы
Короче тут тоже все просто.
Допустим есть столбец name где есть такие записи:
Иван Иванович Иванов, Петр Иванович Наливкин, Николай Иванович Наливкин ...
% перед искомой строкой: говорит нам о том, что мы ищем записи, оканчивающиеся на Наливкин.
'%Наливкин' = Петр Иванович Наливкин, Николай Иванович Наливкин ...
% после искомой строки: говорит нам о том, что мы ищем записи, начинающиеся на Наливкин.
'Наливкин%' - если написать так, то ничего не выдаст, ведь все наши записи в форме Имя Отчество Фамилия, а следовательно Наливкин будет всегда стоять в конце.
% с обеих сторон строки:
'%Наливкин%': а вот так в результате получим все строки в которых есть слово Наливкин
Группируем результаты при помощи GROUP BY
Когда нам нужно вывести количество каких-то объектов относительно какого-нибудь признака. Например количество товаров по различным странам, количество парков в каком-нибудь городе ... очень удобно использовать group by.
SELECT depno, COUNT(depno) FROM tableName
GROUP BY depno
Сортируем результаты при помощи ORDER BY
Просто пишем ORDER BY и устраиваем жесткую фильтрацию.
SELECT column name FROM tableName
GROUP BY column name DESC
Тут 2 опции:
- DESC - по убыванию
- ASC - по возрастанию
Ограничиваем количество результатов LIMIT:
Тут все аналогично сортировке
Пишем LIMIT и ограничиваем количество строк, которые мы хотим вывести. LIMIT 10 и нам выведет только первые 10 строк.
В паре с LIMIT бывает используют OFFSET.
Допустим
LIMIT 10 OFFSET 10
выведет вторые 10 строк и пропустит первые 10.
ТЕ 11-ю, 12-ю, ... , 19-ю и 20-ю.