База данных Isar: как использовать ее с Flutter | Приложение Todo

Привет, ребята, в этом посте мы увидим, как использовать базу данных Isar с Flutter. Теперь первый вопрос, который возникает у вас в голове, будет заключаться в том, зачем вам использовать эту новую базу данных, когда есть другие доступные варианты, например Hive.

Зачем использовать базу данных Isar?

Он легко масштабируется, быстр и кроссплатформенен.
Кроме того, он очень прост в использовании и предоставляет множество функций для фильтрации и запроса данных из базы данных.
Ранее мы использовали Hive, но он очень долго загружает большой объем данных. Но после перехода на Isar теперь мы можем загружать данные за несколько миллисекунд.

Теперь приступим непосредственно к реализации.

Как это использовать?

Итак, мы будем создавать приложение Todo с помощью Isar, которое сохранит данные даже после закрытия приложения.
Для управления состоянием я использую здесь Provider, но это не повлияет на функции базы данных.

Продолжайте и установите зависимости, как указано в этой ссылке.

Структура файла…

models/todo.dart→ Этот файл содержит класс, определяющий элемент Todo.
models/todo.g.dart→ Этот файл создается Isar< br /> provider/todos_provider.dart→ Этот файл содержит все управление состоянием
screens/home_screen.dart → Реализация пользовательского интерфейса

Тодо Модель

В Isar набор данных можно определить, аннотировав класс как @Collection().
Вы можете увидеть то же самое в приведенном ниже фрагменте кода.
Кроме того, если вам нужно, чтобы поле было id, вы можете аннотировать это поле как @Id().
Я использовал автоинкрементатор, предоставленный Isar.

Запустить генератор кода…

Теперь запустите эту команду, чтобы Isar мог сгенерировать файл схемы для вашей модели.

flutter pub run build_runner build

Функции базы данных Isar

Во-первых, нам нужно будет инициализировать базу данных, для этого вам нужна схема, которую вы хотите использовать.

final isar = await Isar.open(
    schemas: [TodoSchema],
);

Вы также можете передать путь к каталогу, если хотите хранить базу данных в определенном месте.

Получение всех задач…

Для выполнения любой операции CRUD в Isar нам нужна транзакция. Они также объединяют несколько операций в одну единицу.

Доступны два типа транзакций:
.txn → эту транзакцию можно использовать только для чтения данных.
.writeTxn → эту транзакцию можно используется как для чтения, так и для письма.

await isar!.txn((isar) async {
    final todosCollection = isar.todos;
    _todos = await todosCollection.where().findAll();
    notifyListeners();
});

Как видите, мы можем использовать .where().findAll(), чтобы получить все данные. Вы также можете указать любое условие внутри .where() для запроса данных.

Добавление задачи…

Теперь, когда мы добавляем данные в базу данных, мы будем использовать .writeTxn для выполнения операции. Чтобы добавить или обновить запись, вы должны использовать функцию .put(), которая вернет идентификатор добавленной/обновленной записи.

void addTodo(Todo todo) async {
    await isar!.writeTxn((isar) async {
        int id = await isar.todos.put(todo);
    });
    _todos.add(todo);
    notifyListeners();
}

Isar автоматически назначит новый идентификатор объекту, если поле id не доступно только для чтения.

Удаление задачи…

Чтобы удалить запись из коллекции, необходимо вызвать функцию .delete(id) и передать идентификатор удаляемой записи. Функция удаления вернет логическое значение, указывающее на успешное удаление.

void deleteTodo(Todo todo) async {
    await isar!.writeTxn((isar) async {
        bool deleted = await isar.todos.delete(todo.id);
        if (deleted) _todos.remove(todo);
        notifyListeners();
    });
}

Обновление Todo…

Здесь мы переключим поле isImportant задачи. Если идентификатор существует в коллекции, метод .put автоматически обновит эту запись.

void toggleImp(int id) async {
    await isar!.writeTxn((isar) async {
        Todo? todo = await isar.todos.get(id);
        todo!.isImportant = !todo.isImportant;
        await isar.todos.put(todo);
    });
}

Полный код со всеми методами…

Реализация пользовательского интерфейса

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

Вот окончательный вывод

Это все для этого. Надеюсь, вам понравится.

Спасибо, что дочитали до этого момента. Не забудьте оставить комментарий для любых предложений и 👏 для этой истории.