Создаём приложение заметок. Основы работы с SQLite в Android.

Урок 20 — Создаём приложение заметок. Основы работы с SQLite в Android.

В прошлых уроках мы создали своё первое серьёзное приложение, позволяющее устанавливать и удалять приложения.

Теперь же мы начнём создавать уже второе приложение — для хранения заметок. И, как и раньше, при создании приложения постепенно будем получать новые навыки и знания, необходимые для каждого разработчика.

Давайте же сформулируем задачу, которую мы решим за ближайшие несколько уроков: создать приложение, которое позволит создавать, хранить, удалять и редактировать заметки. Приложение должно уметь не только сохранять текст (это слишком уж банально), но и прикреплять фотографии.

Ну и, конечно же, всё это будет реализовано с использованием Material Design.

Работа с SQLite

В Android, как и в iOS, есть встроенная в систему компактная база данных — SQLite.

SQLite обладает рядом недостатков — например, в него нельзя писать данные одновременно из нескольких потоков. Однако, все эти недостатки перекрываются огромным (для мобильных устройств) преимуществом: она чрезвычайно компактна.

Вся база данных хранится в одном-единственном файле, и, хоть и работает она относительно медленно (по сравнению со "старшими братьями"; для своих целей она является очень даже шустрой), но при этом занимает очень мало места и способна работать даже на самых слабых устройствах.

Чтобы понять, как оно работает, давайте попробуем поработать с SQLite на компьютере. Если вы не знакомы с SQL, рекомендую ознакомиться с этой статьёй и ссылками в ней.

В практике работы с SQLite нам поможет приложение SQLite Database Browser. Оно полностью бесплатно, работает на macOS, Windows и Linux, и исходный код доступен на GitHub. Скачайте и установите его.

После установки запустите приложение и нажмите на кнопку New Database:

Кнопка "New Database"
Кнопка "New Database"

Введите имя и расположения файла, в котором будет создана БД и нажмите на кнопку Save:

Выбор файла для сохранения БД
Выбор файла для сохранения БД

После этого появится диалог, предлагающий создать таблицу. Закройте его — мы будем создавать её вручную.

Выберите вкладку Execute SQL:

Вкладка "Execute SQL"
Вкладка "Execute SQL"

Для начала нам нужна одна таблица, в которой мы будем хранить заметки. В таблице будут такие столбцы:

  • idinteger, primary key. Идентификатор заметки.
  • titletext, заголовок заметки.
  • notetext, текст заметки.
  • created_tsinteger, дата создания заметки в формате unix time.
  • updated_tsinteger, дата последнего изменения заметки в формате unix time.

SQL-запрос для создания таблицы будет таким:

CREATE TABLE notes (id INTEGER PRIMARY KEY, title TEXT NOT NULL, note TEXT NOT NULL, created_ts INTEGER, updated_ts INTEGER);

Введите его в поле для запроса и нажмите на кнопку Execute SQL. Результат выполнения появится в окне ниже:

Результат выполнения SQL
Результат выполнения SQL

Теперь вернемся на вкладку Database Structure и посмотрим, что получилось:

Структура БД SQLite
Структура БД SQLite

Отлично. Теперь вставим первую заметку в нашу таблицу:

INSERT INTO notes (title, note, created_ts, updated_ts) VALUES ('Hello', 'Hello, world! Наша первая заметка!', 0, 0);

В качестве времени создания и обновления для простоты передадим 0, то есть начало эпохи UNIX. Выполните этот запрос и перейдите на вкладку Browse Data:

Данные в БД SQLite
Данные в БД SQLite

Как видите, данные вставились успешно. Добавьте ещё одну заметку:

INSERT INTO notes (title, note, created_ts, updated_ts) VALUES ('Вторая заметка', 'А это уже вторая заметка', 123, 456);

У неё мы изменили время создания и редактирования.

Зачем? Чтобы показать работу сортировки в SQLite. Мы будем показывать первыми те заметки, которые были изменены последними.

Если вы выполните следующий запрос:

SELECT id, title, note, created_ts, updated_ts FROM notes;

То получите вот такой результат:

Результат выполнения SELECT
Результат выполнения SELECT

То есть первой показывается первая заметка. А теперь выполните вот такой запрос:

SELECT id, title, note, created_ts, updated_ts FROM notes ORDER BY updated_ts DESC;

В нём мы говорим базе данных, что нужно отсортировать данные по полю updated_ts, при этом сортировку нужно выполнить по убыванию. Результатом будет следующий набор данных:

Данные в БД SQLite с сортировкой
Данные в БД SQLite с сортировкой

Отлично.

Теперь давайте попробуем обновить заметку:

UPDATE notes SET title = 'Первая заметка', note = 'Всё та же первая заметка, но обновленная', updated_ts = 890 WHERE id = 1;

Главное — не забыть WHERE, иначе обновятся все строки в таблице.

Ну и удалим заметку:

DELETE FROM notes WHERE id = 1;

Последняя вещь, о которой нужно узнать — это индексы. Если у пользователя будет много заметок, то сортировка может занимать достаточно продолжительное время, в результате, список заметок будет отображаться с лагами. Поэтому нам нужно создать индекс по столбцу updated_ts:

CREATE INDEX updated_ts_index ON notes (updated_ts);

Вот и всё! Примерно то же самое мы будем делать в нашем приложении.

SQLite в Android

Работа с SQLite в Android отличается от того, что мы делали ранее всего парой аспектов:

  • Вам почти никогда не придётся работать с "сырыми" SQL-запросами — для вставки/получения/удаления записей есть удобные методы.
  • Стандартное для большинства движков БД имя столбца id в Android по какой-то неведомой причине принято заменять на _id. Лучше следовать этому стандарту, иначе некоторые вещи могут сломаться.

Базы данных хранятся в приватных директориях приложений, то есть они недоступны для других приложений.

Создайте новый проект, как мы делали это ранее. В прошлом проекте мы хранили все файлы в одном пакете. В этом мы более аккуратно подойдём к организации. Начнём, собственно, с БД.

Внутри основного пакета создайте пакет db:

Создание нового пакета
Создание нового пакета

Пакет "db"
Пакет "db"

Контракт БД

В пакете db, который мы создали ранее, создайте класс NotesContract:

public final class NotesContract {

    private NotesContract() {
    }

    public static abstract class Notes implements BaseColumns {
    }

}

Этот класс облегчит работу с БД, а так же будет выступать в качестве "документации" структуры нашей БД для тех, кто возможно будет смотреть наши исходники. В нём мы будем описывать таблицы, которые будут присутствовать в БД.


Продолжение доступно на платных тарифах

Это недорого — всего от 440 ₽ в месяц!


ВЫБРАТЬ ТАРИФ


Продолжение доступно после регистрации

Все уроки на сайте доступны абсолютно бесплатно после регистрации.

Регистрация займёт меньше минуты ;)